Основы работы с базами 1С через OLE

Примечание - большая часть написанного здесь текста с примерами взята по памяти (пару лет назад изучал достаточно подробно, поэтому может что-то в алгоритмах не работать - я ведь их не копировал откуда-то, а прямо тут же и писал, так что за синтаксические ошибки не пинайте) - на данный момент я активно OLE не пользуюсь (не из-за каких-то проблем с самим OLE, а из-за отсутствия надобности в его использовании в текущий момент).
33,2 тыс. 12,9 тыс.

Примечание - большая часть написанного здесь текста с примерами взята по памяти (пару лет назад изучал достаточно подробно, поэтому может что-то в алгоритмах не работать - я ведь их не копировал откуда-то, а прямо тут же и писал, так что за синтаксические ошибки не пинайте) - на данный момент я активно OLE не пользуюсь (не из-за каких-то проблем с самим OLE, а из-за отсутствия надобности в его использовании в текущий момент).

Основные преимущества, благодаря которым OLE активно используется:

  • Для вызывающей базы "по барабану" - какой тип вызываемой базы (DBF или SQL)
  • Объектами вызываемой базы можно управлять всеми известными методами работы с объектами в 1С (т.е. со справочниками работают методы ВыбратьЭлементы(), ИспользоватьДату() и т.п., с документами - ВыбратьДокументы() и т.п.), соответственно, можно напрямую решить - стоит отрабатывать конкретные объекты базы OLE или пропустить их.

Пример 1. Присоединение к базе 1С через OLE.

БазаОле=СоздатьОбъект("V77.Application");// Получаем доступ к OLE объекту 1С
Локальная версия (на одного пользователя):V77L.Application
Сетевая версия:V77.Application
Версия SQL:V77S.Application

Далее вместо термина "вызываемая база" будет написано просто "база OLE", а вместо термина "вызывающая база" - "местная база"

Теперь, мы должны знать несколько параметров для запуска базы OLE: Каталог базы, имя пользователя и пароль. Ну, наверное, еще и желание запустить 1С в монопольном режиме :)

КаталогБазыОЛе = "C:program files1cv77МояБаза";
ПользовательОле = "Администратор";
ПарольОле = "qwerty";
МонопольныйРежимOLE = " /m"; // для немонопольного запуска указать пустую строку!
ЗапускБезЗаставки = 1; // для появления заставки (например, чтобы наблюдать
// процесс запуска базы OLE визуально) поставьте здесь "0"
РезультатПодключения = БазаОле.Initialize ( БазаОле.RMTrade , "/d" +
СокрЛП(КаталогБазыОле) + " /n" + СокрЛП(ПользовательОле)+
" /p" + СокрЛП(ПарольОле) + МонопольныйРежимOLE,
?(ЗапускБезЗаставки = 1,"NO_SPLASH_SHOW",""));
Если
РезультатПодключения = 0 Тогда
Предупреждение("Не удалось подключится к указанной базе - проверьте вводные!");
КонецЕсли;

Комментарий: функции СокрЛП() стоят в примере на случай, если пользователь захочет указанные выше переменные сделать в форме диалога, а проблема при этом состоит в том, что в алгоритм программа передаст полное значение реквизита (т.е. допишет в конце значения то количество пробелов, которое необходимо для получения полной длины строки (указана в свойствах реквизита диалога)).

Пример 2. Доступ к объектам базы OLE.

Запомните на будущее как непреложный факт:

  1. Из местной базы в базу OLE (и, соответственно, наоборот) напрямую методом присвоения можно перенести только числовые значения, даты и строки ограниченной длины!!! Т.е. местная база поймет прекрасно без дополнительных алгоритмов преобразования полученного значения только указанные типы значений. Кроме того, под ограничением строк подразумевается проблемы с пониманием в местной базе реквизитов объектов базы OLE типа "Строка неограниченной длины". К этому же еще надо добавить и периодические реквизиты. Естественно, под методом присвоения подразумеваются и попытки сравнить объекты разных баз в одном условии (например, в алгоритмах "Если" или "Пока" и т.п.).
  2. Есть проблемы при попытке перенести "пустую" дату - OLE может ее конвертировать, например, в 31.12.1899 года и т.п. Поэтому вам лучше заранее выяснить те значения, которые могут появится в местной базе при переносе "пустых" дат, чтобы предусмотреть условия преобразования их в местной базе.

A) Доступ к константам базы OLE:

ЗначениеКонстантыOLE=БазаОле.Константа.ДатаЗапретаРедактирования;

Б) Доступ к справочникам и документам базы OLE (через функцию "CreateObject"):

СпрOLE=БазаОле.CreateObject("Справочник.Фирмы");// "СоздатьОбъект" в OLE не работает!
ДокOLE=БазаОле.CreateObject("Документ.РасходнаяНакладная");

После создания объекта справочника или документа к ним применимы все методы, касающиеся таких объектов в 1С:

СпрОле.ВыбратьЭлементы();
Пока
СпрОле.ПолучитьЭлемент()=1Цикл
Сообщить(Спр.Наименование);
КонецЦикла;

Заметьте, что если вместо "Сообщить(Спр.Наименование)" вы укажете "Сообщить(Спр.ТекущийЭлемент())", то вместо строкового/числового представления этого элемента программа выдаст вам в окошке сообщение "OLE". Именно это я и имел в виду, когда говорил, что напрямую мало что можно перенести. Т.е. не будут работать следующие методы (ошибки 1С не будет, но и результат работы будет нулевой). Рассмотрим следующий пример:

СпрOLE=БазаОле.CreateObject("Справочник.Фирмы");// это справочник в базе OLE
Док=СоздатьОбъект("Документ.РасходнаяНакладная");// а это документ в местной базе
Док.Новый();// создаем новый документ в местной базе
СпрOLE.НайтиПоКоду(1,0);// спозиционируем в базе OLE
// на фирме с кодом "1".
Док.Фирма=СпрOLE.ТекущийЭлемент();// такой метод не сработает, т.к. справа от "=" стоит
// объект не местной базы, и местная база 1С его не понимает!

Однако,  сработает следующий метод:

Спр=СоздатьОбъект("Справочник.Фирмы");         // создаем объект справочника местной базы
Спр.НайтиПоНаименованию(СпрОле.Наименование,0,0);// Или Спр.найтиПоКоду(СпрОле.Код,0);
// т.е. СпрОле.Код и Спр.наименование
// являются обычными числовыми/строковыми
// значениями, которые понимает местная база!
Док.Фирма=Спр.ТекущийЭлемент();// Вот теперь все в порядке, т.к. с обоих сторон метода
// стоят объекты только местной базы!

Отсюда вывод: возможность доступа к объектам базы 1С через OLE требуется, в основном, только для определенной задачи - получить доступ к реквизитам определенного элемента справочника или документа. Однако, не забываем, что объекты базы OLE поддерживают все методы работы с ними, в т.ч. и "Новый()", т.е. приведем пример противоположный предыдущему:

ДокОле=CreateObject("Документ.РасходнаяНакладная");// Создаем документ в базе OLE
ДокОле.Новый();
Спр=СоздатьОбъект("Справочник.Фирмы");// В местной базе получаем доступ к справочнику
Спр.НайтиПоКоду(1,0);// Находим в местной базе фирму с кодом 1 (если есть)
ДокОле.Фирма=Спр.ТекущийЭлемент();// такой метод не сработает

Однако,  сработает следующий метод:

СпрОле=БазаОле.CreateObject("Справочник.Фирмы");// создаем объект справочника базы OLE
СпрОле.НайтиПоНаименованию(Спр.Наименование,0,0);// Или СпрОле.найтиПоКоду(Спр.Код,0);
// т.е. Спр.Код и Спр.Наименование являются обычными числовыми/строковыми значениями,
// которые понимает база OLE!
ДокОле.Фирма=СпрОле.ТекущийЭлемент();// Вот теперь все в порядке, т.к. с обоих сторон
// метода стоят объекты базы OLE!
ДокОле.Записать();// запишем документ в базе OLE
ЕслиДокОле.Провести()=0тогда
Сообщить("Не смогли провести документ!");
КонецЕсли;

В) Доступ к регистрам базы OLE (Не сложнее справочников и документов):

РегОле=БазаOLE.CreateObject("Регистр.ОстаткиТоваров");
РегОле.ВыбратьИтоги();
Пока
РегОле.ПолучитьИтог()=1Цикл// Не забываем, что надо указывать наименование!
Сообщить("Остаток для "+РегОле.Товар.Наименование+" на складе "+
РегОле.Склад.Наименование+" равен "+РегОле.ОстатокТовара);
КонецЦикла;

Г) Доступ к перечислениям базы OLE (аналогичен константе):

ЗначениеПеречисленияOLE=БазаОле.Перечисление.Булево.НеЗнаю;// :)

Заметьте, что пользы для местной базы от переменной "ЗначениеПеречисленияOLE" особо-то и нет, ведь подобно справочнику и документу перечисление также напрямую недоступно для местной базы. Пожалуй, пример работы с ними может быть следующим (в качестве параметра условия):

СмотретьТолькоВозвратыПоставщикам=1;// предположим, что это - флажок в форме диалога,
// который мы либо устанавливаем, либо снимаем
ДокОле=БазаОле.CreateObject("Документ.РасходнаяНакладная");
ДокОле.ВыбратьДокументы(НачДата,КонДата);// НачДата и КонДата - также реквизиты формы
// диалога, но база OLE прекрасно их понимает -
// ведь это же даты!
ПокаДокОле.ПолучитьДокумент()=1Цикл
ЕслиСмотретьТолькоВозвратыПоставщикам=1Тогда
ЕслиДокОле.ПризнакНакладной<>БазаОле.Перечисление.ПризнРасхНакл.ВозвратПоставщикуТогда
Продолжить;
КонецЕсли;
Иначе
ЕслиДокОле.ПризнакНакладной=БазаОле.Перечисление.ПризнРасхНакл.ВозвратПоставщикуТогда
Продолжить;
КонецЕсли;
КонецЕсли;
Сообщить(ДокОле.Вид()+" № "+ДокОле.НомерДок+" от "+ДокОле.датаДок);
КонецЦикла;

Д) Доступ к счетам базы OLE:

СчтОле=БазаОле.CreateObject("Счет");
СчтОле.НайтиПоКоду("10.5");// нашли в базе OLE счет 10.5

Е) Доступ к ВидамСубконто базы OLE (аналогичен перечислению):

ВидСубконтоКонтрагентыОле=БазаОле.ВидыСубконто.Контрагенты;

По аналогии со справочниками и документами работает объект "Периодический", план счетов работает по аналогии с ВидомСубконто, ну и далее в том же духе… Отдельную главу посвятим запросу, а сейчас… стоп. Еще пункт забыл!

Ж) Доступ к функциям и процедурам глобального модуля базы OLE!

Как же я про это забыл-то, а? Поскольку при запуске базы автоматически компилируется глобальный модуль, то нам становятся доступны функции и процедуры глобального модуля (поправлюсь - только те, у которых стоит признак "Экспорт"). Плюс к ним еще и различные системные функции 1С. А доступны они нам через функцию 1С OLE - EvalExpr(). Приведем примеры работы с базой OLE:

ДатаАктуальностиОле=БазаОле.EvalExpr("ПолучитьДатуТА()");
// Возвращает дату актуальности
ИмяПользователяОле=БазаОле.EvalExpr("ИмяПользователя()");
// возвращает строку
//
// попробуем теперь получить числовое значение НДС у элемента номенклатуры
// через функцию глобального модуля ПроцентНДС(СтавкаНДС) Экспорт!
ТовОле=БазаОле.CreateObject("Справочник.Номенклатура");
ТовОле.ВыбратьЭлементы();
// Найдем элемент справочника (не группа!)
ПокаТовОле.ПолучитьЭлемент()=1Цикл
ЕслиТовОле.ЭтоГруппа()=0Тогда
Прервать;
КонецЕсли;
КонецЦикла;
ЧисловоеЗначениеПроцентаНДСТовараОле= БазаОле.EvalExpr("ПроцентНДС(Перечисление.ЗначенияНДС."+
ТовОле.СтавкаНДС.Идентификатор()+")");

На самом деле, в последней строке примера я исхитрился и забежал немного вперед. Дело в том, что как и запрос (см. отдельную главу), так и EvalExpr() выполняются внутри базы OLE, причем команды передавается им обычной строкой, и поэтому надо долго думать, как передать необходимые ссылки на объекты базы OLE в строке текста местной базы. Так что, всегда есть возможность поломать голову над этим…

Алгоритмы преобразования объектов в "удобоваримый вид" между базами.

Ясно, что алгоритмы преобразования нужны не только для переноса объектов между и базами, но и для такой простой задачи, как попытки сравнить их между собой.

И еще раз обращу внимание: ОБЪЕКТЫ ОДНОЙ БАЗЫ ПРЕКРАСНО ПОНИМАЮТ ДРУГ ДРУГА, ПРОБЛЕМЫ ВОЗНИКАЮТ ТОЛЬКО ТОГДА, КОГДА ВЫ НАЧИНАЕТЕ СВЯЗЫВАТЬ МЕЖДУ СОБОЙ ОБЪЕКТЫ РАЗНЫХ БАЗ, т.е. команда

ДокОле.Фирма=СпрОле.ТекущийЭлемент();

// где ДокОле - документ базы OLE, а СпрОле - справочник "Фирмы" базы OLE

будет прекрасно работать без ошибок. Не забывайте это, чтобы не перемудрить с алгоритмами!

Итак, повторяюсь, что напрямую перенести, да и просто сравнить можно только даты (причем не "пустые"), числа и строки ограниченной длины. Итак, как же нам сравнить объекты разных баз (не числа, не даты, не строки), т.е. как их преобразовать в эту самую строку/число/дату.

Егоров Андрей Викторович
Mista.Ru


Начать дискуссию

Иностранные IT-компании не смогут получать льготы в РФ

Из реестра аккредитованных IT-компаний уберут иностранный бизнес. Предприятия не смогут получать налоговые преференции и отсрочку от армии для своих сотрудников.

Курсы повышения
квалификации

20
Официальное удостоверение с занесением в госреестр Рособрнадзора

Утвердят бланк, чтобы останавливать упрощенную ликвидацию компании

С 1 июля 2023 года действует процедура упрощенной ликвидации компаний малого бизнеса. Но если учредители передумали и решили продолжить бизнес, надо подать заявление об остановки процесса ликвидации. Формы такого заявления сейчас нет. Но оно будет.

ФНС будет получать данные о загранпаспортах

МВД будет сообщать налоговикам сведения о выдаче россиянам загранпаспортов. Форму таких сведений утвердят.

Лучшие спикеры, новый каждый день

🙎 Бухгалтеры не понимают, как считать НДФЛ 15% и зачем ФНС сравнивает 6-НДФЛ с уведомлениями. Топ новостей за неделю

Мы собрали для вас самые важные бухгалтерские новости прошлой недели, которые вы могли пропустить.

Вклады

Банки начнут открывать вклады по биометрии

Взять кредит или открыть вклад будет можно без личного визита в офис банка, идентификацию клиентов будут проводить по биометрии.

Маркетинг

Цветы к 8 Марта подорожают на 15-20%

Из-за проблем с логистикой и высокого спроса средняя стоимость праздничного букета вырастет до 3,4 тысяч рублей.

91
Опытом делятся эксперты-практики, без воды

Как реагировать на критику клиентов и конкурентов? 5 моментов

Критика в бизнесе — не только неприятный момент столкновения с обратной связью покупателей и конкурентов, но и шанс на улучшения. Предприниматели должны уметь трезво оценить её и использовать для роста компании. Чтобы это сделать, можно воспользоваться следующим алгоритмом.

Как реагировать на критику клиентов и конкурентов? 5 моментов

Отчётность по РСБУ и МСФО: в чём отличия и что важно знать инвесторам

Если компания становится публичной и присутствует на бирже, она обязана раскрывать свою финансовую информацию. У нас чаще всего используются отчётности по РСБУ (российским стандартам бухгалтерского учета) и МСФО (международным стандартам финансовой отчетности).

Отчётность по РСБУ и МСФО: в чём отличия и что важно знать инвесторам
154
Новости ФНС

Как восстановить пароль от своего личного кабинета налогоплательщика

Иногда налогоплательщик не может войти в личный кабинет на сайте ФНС по причине утери пароля доступа. Пароль можно восстановить.

Сколько зарабатывает аналитик 1С без опыта

Обошли весь сайт hh.ru и нашли вакансии для начинающих аналитиков 1С. Оказалось, что в среднем выпускники курсов без опыта могут получать до 75 тыс. рублей, а стажеры около 40-50 тыс. рублей.

За год Роструд восстановил права 300 тысяч сотрудников

Работодатели погасили долги по зарплате на 12 млрд рублей, число жалоб от сотрудников на нарушение их трудовых прав сократилось на треть.

Законопроекты

Кабмин против того, чтобы производители крупно писали объем и вес продуктов

Правительство не согласилось с тем, чтобы информация о весе и объеме продуктов питания занимала не меньше 15% от площади упаковки или этикетки.

Миникурсы, текстовые и видеоинструкции для бухгалтеров
Банки

Банк «Точка»: все сервисы и услуги работают бесперебойно

В Трибуне «Клерка» пользователь написал пост, в котором постарался разобраться, что же произошло в результате отзыва лицензии у Банка КИВИ и как это повлияло на клиентов другого банка — «Точки». Пост получился жестким и набрал много комментариев, в которые заглянули и представители банка.

Обзоры новостей

⚡️Итоги дня: букет к 8 Марта обойдется в 3,2 тыс руб., колонку Алису отдели в пальто

Подготовили для вас дайджест главных событиями дня. Все самое интересное, что писали и обсуждали в сети, в одной подборке.

2
153
Платежные системы

Contact удалили из реестра платежных систем Центробанка

Платежная система Contact, которая принадлежит QIWI банку, исключена из реестра ЦБ.

Зарплата

Сверхурочную работу будут оплачивать по-новому

Работодатели будут оплачивать сверхурочную работу исходя из зарплаты, включающей компенсационные и стимулирующие выплаты, а не только из голого оклада.

Инвестиции

На Мобирже начали продаваться акции алкогольной группы «Кристалл»

Компания привлекла на IPO 1,15 млрд рублей. Стоимость одной акции — 9,5 рублей.

Что бухгалтеры дарят мужчинам на 23 февраля. «Ночной бухгалтер» №1629

Носки, пена для бритья...это все не для дам-бухгалтеров. Они поздравляют своих мужчин куда как креативнее.

Иллюстрация: Вера Ревина / Клерк.ру
336

Внесите эти изменения в локальные акты, чтобы не оштрафовала ГИТ

В 2023 году Конституционный суд выпустил сразу шесть постановлений, которые касаются трудовых отношений. Узнайте, что нужно сделать работодателям, чтобы не нарушать основной закон страны.

Валютный контроль

ИП может не отчитываться за личный счет в банке Казахстана, но должен отчитаться за счет в Узбекистане

Физлица должны сдавать отчеты о движении средств по своим зарубежным счетам. Но есть нюансы для счетов в странах ЕАЭС.