При настройке обмена данными между базами 1С часто возникает сложность с переносом документа Операция (бухгалтерский и налоговый учет). Основная трудность заключается в том, что этот объект не является обычным документом с табличной частью: его данные хранятся в РегистрБухгалтерии, а связь с ним осуществляется через поле Регистратор. В процессе обмена разработчики сталкиваются с тем, что либо не переносятся проводки, либо при попытке обращения к Регистратор система выдает пустую ссылку. Давайте подробно разберем, как решить эту задачу.
Для начала проанализируем ситуацию: документ Операция — это специализированный объект. Когда вы в пользовательском режиме видите проводки в форме документа, 1С в этот момент выполняет запрос к регистру бухгалтерии, фильтруя записи по текущему документу. При автоматическом обмене через ПланыОбмена стандартный механизм может не «видеть» проводки, так как они не входят в состав самого объекта документа, а являются его движениями.
Если вы пытаетесь получить данные через РегистрыБухгалтерии.ИмяРегистра.ВыбратьПоРегистратору(СсылкаНаДокумент), вы можете столкнуться с тем, что ссылка на документ пуста или объект еще не записан в базу-приемник. Это происходит потому, что в момент обработки сообщения обмена объект еще не прошел этап записи в базе данных, а значит, у него еще нет уникального идентификатора, по которому регистр мог бы найти движения.
Посмотрим на пример работы с данными. Вместо использования методов типа ВыбратьПоРегистратору, которые могут быть нестабильны в контексте обмена, рекомендуется использовать явные запросы. Под капотом системы любой метод выбора все равно сводится к запросу, поэтому лучше контролировать его самостоятельно.
Рассмотрим логику работы: перед тем как выгрузить документ, нам нужно собрать все данные по его движениям в структуру или XML-пакет. Мы можем использовать такой подход:
// Пример логики запроса для получения движений
ВЫБРАТЬ
Регистр.Период,
Регистр.СчетДт,
Регистр.СубконтоДт,
Регистр.СчетКт,
Регистр.СубконтоКт,
Регистр.Сумма
ИЗ
РегистрБухгалтерии.Хозрасчетный КАК Регистр
ГДЕ
Регистр.Регистратор = &СсылкаНаДокумент
При использовании этого метода вы получаете полный набор записей, который можете передать в сообщении обмена вместе с реквизитом ПерекинутьВДругуюБазу.
Разберем самый надежный алгоритм переноса. Суть заключается в последовательной передаче данных: сначала вы передаете «шапку» документа, затем его движения.
ПередВыгрузкой для документа Операция считываем все записи из регистра бухгалтерии, которые соответствуют данному Регистратор. Упаковываем их в структуру или таблицу значений, которую прикрепляем к выгружаемому объекту.НаборЗаписей соответствующего регистра бухгалтерии.Посмотрим на пример кода, который необходимо выполнить в базе-приемнике после записи документа:
// Получаем набор записей для нашего документа
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СозданнаяСсылкаНаДокумент);
// Заполняем набор данными, полученными из сообщения
Для Каждого СтрокаДвижений Из ПолученныеДанныеПроводок Цикл
Запись = НаборЗаписей.Добавить();
ЗаполнитьЗначенияСвойств(Запись, СтрокаДвижений);
КонецЦикла;
// Записываем движения
НаборЗаписей.Записать();
Если вы добавили в документ свой реквизит, например, ПерекинутьВДругуюБазу, убедитесь, что он включен в состав ПланОбмена. Без этого даже при правильной настройке выгрузки данных, система будет игнорировать этот реквизит.
Проанализируем шаги настройки:
ПланОбмена.Операция.ПерекинутьВДругуюБазу отмечен галочкой в списке свойств для выгрузки.КД 2, обязательно проверьте правило конвертации свойств (ПКС) для этого реквизита, чтобы он корректно мапился между двумя конфигурациями.Следуя этим рекомендациям, вы сможете добиться стабильного переноса как самих документов, так и их бухгалтерских проводок, избегая ошибок пустых ссылок и потери данных. Помните, что разделение логики выгрузки документа и его движений — это стандартная практика, которая обеспечивает целостность учета при обмене.