При настройке обмена данными между информационными базами 1С с помощью правил конвертации (конфигурация «Конвертация данных») разработчики нередко сталкиваются с ситуацией, когда документы успешно переносятся в базу-приемник, однако реквизиты счетов учета расчетов с контрагентами, счетов учета номенклатуры и счетов учета НДС остаются пустыми. В результате такие документы не могут быть проведены без ручного вмешательства пользователя или перевыбора договора в документе.
Разберем подробно причины такого поведения платформы и рассмотрим по шагам все способы решения данной задачи: от правильной настройки правил конвертации до программного заполнения счетов в обработчиках событий.
При интерактивной работе пользователя в базе (когда открыта форма документа) выбор контрагента, договора или номенклатуры запускает клиент-серверные обработчики событий формы. В этот момент конфигурация обращается к регистрам сведений СчетаУчетаРасчетовСКонтрагентами и СчетаУчетаНоменклатуры и автоматически подставляет нужные значения.
Однако при программной загрузке через механизмы обмена действуют другие правила:
ОбменДанными.Загрузка = Истина. В этом режиме отключается интерактивная логика форм и подавляющее большинство стандартных проверок и автозаполнений в модуле объекта. Программа считает, что переносится уже готовый, полностью сформированный объект.Проанализируем базовый вариант, когда счета учета уже корректно заполнены в базе-источнике и их требуется перенести в неизменном виде в базу-приемник.
Для корректного переноса выполним следующие действия в «Конвертации данных»:
Хозрасчетный).Код. Обязательно включим флаг «Продолжить поиск по полям поиска, если по идентификатору объект приемника не найден». Это необходимо, если базы не являются идентичными копиями и внутренние идентификаторы (GUID) предопределенных счетов различаются.СчетУчетаРасчетовСКонтрагентом, СчетУчетаРасчетовПоАвансам, СчетУчета, СчетДоходов, СчетРасходов, СчетУчетаНДСПоРеализации.Если в базе-источнике счета не велись вовсе (например, выгрузка идет из конфигурации без бухгалтерского учета, такой как «Управление торговлей», или из базы управленческого учета) либо документы переносятся без счетов, заполнение необходимо выполнить на стороне базы-приемника.
Для этого в ПКО соответствующего документа в обработчике события «После загрузки» напишем алгоритм, вызывающий типовые функции конфигурации-приемника.
Посмотрим на пример заполнения счетов учета номенклатуры в табличной части для конфигураций на базе обычных форм (например, Бухгалтерия предприятия 2.0):
Если Объект.Товары.Количество() > 0 Тогда
Для Каждого СтрокаТовары Из Объект.Товары Цикл
Объект.ЗаполнитьСчетаУчетаВСтрокеТабЧасти(СтрокаТовары, "Товары", Истина);
КонецЦикла;
КонецЕсли;
Рассмотрим универсальный алгоритм прямого обращения к общим модулям конфигурации (актуально для конфигураций линейки 1С:Бухгалтерия):
Для Каждого СтрокаТаблицы Из Объект.Товары Цикл
СчетаУчета = БухгалтерскийУчетПереопределяемый.ПолучитьСчетаУчетаНоменклатуры(Объект.Организация, СтрокаТаблицы.Номенклатура);
Если Не ЗначениеЗаполнено(СтрокаТаблицы.СчетУчета) Тогда
СтрокаТаблицы.СчетУчета = СчетаУчета.СчетУчета;
КонецЕсли;
Если Не ЗначениеЗаполнено(СтрокаТаблицы.СчетДоходов) Тогда
СтрокаТаблицы.СчетДоходов = СчетаУчета.СчетДоходов;
КонецЕсли;
Если Не ЗначениеЗаполнено(СтрокаТаблицы.СчетРасходов) Тогда
СтрокаТаблицы.СчетРасходов = СчетаУчета.СчетРасходов;
КонецЕсли;
Если Не ЗначениеЗаполнено(СтрокаТаблицы.СчетУчетаНДСПоРеализации) Тогда
СтрокаТаблицы.СчетУчетаНДСПоРеализации = СчетаУчета.СчетУчетаНДСПродажи;
КонецЕсли;
Если СтрокаТаблицы.СчетДоходов.ВидыСубконто.Количество() > 0 Тогда
СтрокаТаблицы.Субконто = Новый(СтрокаТаблицы.СчетДоходов.ВидыСубконто[0].ВидСубконто.ТипЗначения.Типы()[0]);
Если ТипЗнч(СтрокаТаблицы.Субконто) = Тип("СправочникСсылка.НоменклатурныеГруппы") Тогда
СтрокаТаблицы.Субконто = СтрокаТаблицы.Номенклатура.НоменклатурнаяГруппа;
КонецЕсли;
Иначе
СтрокаТаблицы.Субконто = Неопределено;
КонецЕсли;
КонецЦикла;
Для конфигураций на Библиотеке стандартных подсистем (БСП) в обработчике «После загрузки» можно передать специальный флаг инициализации автозаполнения:
Объект.ДополнительныеСвойства.Вставить("ЗаполнитьСчетаУчета", Истина);
Проанализируем частую ошибку: код заполнения отрабатывает без ошибок, но реквизиты остаются пустыми. Причина заключается в том, что в базе-приемнике не настроены значения по умолчанию в регистрах сведений.
Для корректной работы автоподстановки проверим заполнение двух ключевых регистров:
СчетаУчетаРасчетовСКонтрагентами: В регистре должна присутствовать как минимум одна запись с незаполненными полями Организация, Контрагент, Договор и ВидРасчетовПоДоговору. В ней должны быть указаны основные счета (например, 60.01 / 60.02 или 62.01 / 62.02). Данная строка является настройкой по умолчанию для всех контрагентов, по которым нет индивидуальных правил.СчетаУчетаНоменклатуры: Аналогично в регистре должна быть строка с пустой организацией, номенклатурой и номенклатурной группой, где заданы базовые счета учета (например, 41.01, 90.01.1, 90.02.1, 90.03).Если цель переноса — быстро подготовить базу для налоговой инспекции исключительно с бухгалтерскими данными, настройка обмена правилами «с нуля» за длительный период может занять слишком много времени. В качестве надежной альтернативы рассмотрим следующий порядок действий:
Такой подход гарантирует сохранение всех существующих бухгалтерских проводок, счетов учета и взаиморасчетов без риска потери данных при обмене.