При работе с современными версиями платформы 1С:Предприятие 8.3 многие разработчики, особенно начинающие свой путь в последние 10 лет, могут столкнуться с кодом, который кажется им «древлянским» или написанным нейросетью с ошибками. Однако это не ошибки, а классический синтаксис 1С:Предприятия 7.7. Рассмотрим подробнее, как устроены эти механизмы, почему они выглядят именно так и как их интерпретировать при настройке обмена данными через Конвертацию данных 2.1.
Проанализируем пример кода, который вызвал недоумение у автора темы. Этот фрагмент представляет собой типичный алгоритм выгрузки данных из базы 7.7 с использованием объекта Запрос. В среде «семерочников» такие запросы часто называли «черными», в отличие от «прямых» SQL-запросов, которые реализовывались через внешние компоненты.
Разберем структуру объекта Запрос по шагам:
Новый для большинства объектов. Вместо него использовалась универсальная функция СоздатьОбъект().
Запрос = СоздатьОбъект("Запрос");
ВЫБРАТЬ ... ИЗ ... ГДЕ. Язык запросов 7.7 строился на описании переменных, группировок и условий.
ТекстЗапроса = "
|ТекущийЭлемент = Справочник.Партнеры.ТекущийЭлемент;
|ДатаИзменения = Справочник.Партнеры.ДатаИзменения;
|Группировка ТекущийЭлемент;
|Условие(ДатаИзменения >= ДатаИзмененияОбъекта);";
ТекущийЭлемент, которая ссылается на объект справочника, задаем поле для фильтрации и определяем, как данные будут сгруппированы в результате.Выполнить() запускает формирование выборки. Обход осуществляется в цикле Пока ... Цикл с помощью метода Группировка().
Запрос.Выполнить(ТекстЗапроса);
Пока Запрос.Группировка(1) = 1 Цикл
// Работа с данными
КонецЦикла;
Выясним причину появления такого кода в правилах обмена. При использовании Конвертации данных 2.1 для выгрузки из версии 7.7 применяется специальная обработка V77Exp.ert. В этой обработке код из правил обмена выполняется через Шаблон() или Выполнить(), что позволяет использовать встроенный язык «семерки» непосредственно в алгоритмах ПВД (Правил Выгрузки Данных).
Рассмотрим метод ВыгрузитьПоПравилу(), который встречается в примере:
ВыгрузитьПоПравилу(Запрос.ТекущийЭлемент, , , , "Контрагенты");
В данном контексте мы передаем найденный в запросе объект (Запрос.ТекущийЭлемент) в процедуру выгрузки, указывая имя правила («Контрагенты»). Это стандартный способ программного инициирования выгрузки объекта при обмене данными между 7.7 и 8.x.
Чтобы лучше понять эволюцию платформы, посмотрим на примеры из еще более ранней версии — 1С:Бухгалтерия 6.0. В то время синтаксис был еще более специфичным и базировался на использовании восклицательных знаков для команд и совершенно иного подхода к манипуляции данными. Проанализируем пример создания проводок:
!ВЫБРАТЬ СТРОКУ
!пСумма=СКД41:{|2}/СКД41:{|2}Н*ЗН|3
!* Дата; Д; К; Сумма; Содержание;
!ПРОВОДКА ЗН2; "90.2"; "41.1"; пСумма; "НК "+ЗН1+": "+СН{|2}+" по средней";
!СЛЕДУЮЩАЯ СТРОКА
Важно отметить, что даже тогда существовало понятие СКД (Сальдо Конечное Дебетовое), которое многие современные программисты ошибочно принимают исключительно за Систему Компоновки Данных. В версии 6.0 это была встроенная функция для получения бухгалтерских итогов.
Выясним, в чем заключаются ключевые отличия, которые часто сбивают с толку разработчиков «восьмерки»:
РезультатЗапроса, из которого создаем Выборку. В 7.7 объект Запрос сам хранит в себе состояние выборки и курсор текущей строки при вызове метода Группировка().1С++.Если вам довелось сопровождать базу на 7.7 или настраивать из нее обмен, рекомендуем придерживаться следующих правил:
Спр = СоздатьОбъект("Справочник.Номенклатура");
Если Спр.НайтиПоКоду("00001") = 1 Тогда
Сообщить(Спр.Наименование);
КонецЕсли;
ТекущийДокумент() работает только в контексте формы или модуля документа.ПостроительОтчетов в ранних версиях 8.0, который идеологически наследовал часть логики построения выборок.Проанализировав эти «древние технологии», мы видим, что фундамент платформы закладывался десятилетиями. Понимание того, как работали наши предшественники, помогает не только в поддержке старых систем, но и в более глубоком осознании механизмов работы современных версий 1С.