При настройке синхронизации данных между конфигурациями «1С:Управление торговлей» (УТ) и «1С:Бухгалтерия предприятия» (БП) технические специалисты часто сталкиваются с неприятной проблемой: документы (например, «Реализация товаров и услуг» или «Поступление товаров и услуг») переносятся из торговой базы в бухгалтерскую, но табличные части остаются без заполненных счетов учета (счета 41, 10, 20, 90 и т.д.). При этом, если бухгалтер открывает тот же самый документ в БП и добавляет номенклатуру вручную, счета подставляются корректно. Выясним причину этого поведения и разберем по шагам рабочие методы устранения проблемы.
Для того чтобы понять, почему счета учета «игнорируют» процесс загрузки, нам необходимо заглянуть во внутренние механизмы платформы «1С:Предприятие 8». Когда пользователь вводит документ вручную в интерфейсе БП, при изменении номенклатуры в строке табличной части срабатывает специализированное событие формы или модуля. В этот момент конфигурация обращается к регистру сведений СчетаУчетаНоменклатуры, находит подходящую запись и подставляет нужные счета в документ.
Однако при обмене данными ситуация кардинально меняется. Запись объектов происходит программно, и платформа принудительно устанавливает свойство ОбменДанными.Загрузка = Истина для загружаемого объекта. Этот флаг указывает системе, что объект переносится «как есть» из другой информационной базы, поэтому большинство стандартных проверок, подписок на события и обработчиков заполнения отключаются ради оптимизации скорости и предотвращения конфликтов данных. Программа резонно «предполагает», что раз данные выгружены из источника, они уже должны содержать все необходимые реквизиты. Но в «1С:Управление торговлей» (особенно редакции 11) плана счетов и бухгалтерского учета как такового нет. В результате счета учета в БП остаются незаполненными.
Рассмотрим подробнее три основных способа решения этой задачи: программную доработку правил конвертации, использование современных механизмов БП 3.0 и быстрое групповое исправление данных.
Если обмен между УТ и БП настроен по старой схеме с использованием правил конвертации данных (КД 2.0), мы можем принудительно заставить систему заполнить счета учета сразу после загрузки документа. Для этого необходимо добавить специализированный код в обработчики событий.
Откроем правила конвертации в программе «Конвертация данных 2.0», найдем необходимое Правило Конвертации Объектов (например, ПКО РеализацияТоваровУслуг) и перейдем в обработчик события «После загрузки». Проанализируем ситуацию: нам необходимо обратиться к табличной части «Товары» и заполнить счета учета на основании данных БП. Для этого отлично подойдет вызов типового метода БП.
Пропишем следующий код в обработчике:
// Вызываем типовой метод заполнения счетов учета для табличной части Товары
Документы.РеализацияТоваровУслуг.ЗаполнитьСчетаУчетаВТабличнойЧасти(Объект, "Товары");
// Если в документе также присутствует табличная часть Услуги, обрабатываем и ее
Если ОбщегоНазначения.ЕстьРеквизитТабличнойЧастиДокумента("Услуги", Объект.Метаданные()) Тогда
Документы.РеализацияТоваровУслуг.ЗаполнитьСчетаУчетаВТабличнойЧасти(Объект, "Услуги");
КонецЕсли;
Этот способ хорош тем, что он использует встроенную функцию конфигурации-приемника. Метод самостоятельно обратится к актуальным настройкам регистра счетов учета и заполнит строки документа.
В современных релизах «1С:Бухгалтерии предприятия 3.0» разработчики фирмы 1С стандартизировали работу со счетами учета. Теперь вместо разрозненных методов в модулях каждого документа используется единый общий модуль СчетаУчетаВДокументах.
Если вы хотите написать универсальный код для заполнения счетов в любых документах (будь то реализация, поступление или отчет о розничных продажах), лучшим решением будет использование функций этого модуля. Пропишем в обработчике «После загрузки» ПКО документа следующий алгоритм:
// Подготовим структуру отбора для заполнения только незаполненных реквизитов
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("НеЗаполненныеРеквизиты", Истина);
// Вызываем универсальный метод заполнения счетов
СчетаУчетаВДокументах.Заполнить(Объект, ПараметрыЗаполнения);
Также мы можем использовать встроенный механизм отложенного заполнения, передав системе флаг-команду через дополнительные свойства объекта. Этот способ гарантирует, что счета заполнятся непосредственно перед записью объекта в базу данных:
// Передаем команду на автоматическое заполнение перед записью
Объект.ДополнительныеСвойства.Вставить("ЗаполнитьСчетаУчетаПередЗаписью", Истина);
Очень часто программисты ищут ошибку в коде обмена, тогда как проблема кроется в обычных пользовательских настройках ведения учета в самой «1С:Бухгалтерии». Если правила обмена настроены верно, но счета все равно пустые, проверим настройки регистра.
Дело в том, что при переносе номенклатуры из УТ в БП новые элементы могут создаваться вне привычных папок (иерархии) или им может присваиваться некорректный Вид номенклатуры. Разберем, как правильно настроить регистр:
Что делать, если обмен уже прошел, сотни документов загружены с пустыми счетами учета, а перевыгружать их заново долго или невозможно? Нам не обязательно писать внешние обработки «на коленке». Воспользуемся штатным и безопасным механизмом БП 3.0 — обработкой «Групповое изменение реквизитов».
Выполним следующие шаги:
Реализация товаров и услуг.
// Программный вызов заполнения счетов через универсальный модуль
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("НеЗаполненныеРеквизиты", Истина);
СчетаУчетаВДокументах.Заполнить(Объект, ПараметрыЗаполнения);
Отсутствие счетов учета при обмене между УТ и БП — это стандартная особенность работы платформы 1С, связанная с флагом загрузки данных. Для предотвращения этой проблемы достаточно один раз внести исправления в правила конвертации объектов с использованием вызова СчетаУчетаВДокументах.Заполнить() или настроить отложенное заполнение реквизитов. Также всегда проверяйте корректность заполнения регистра сведений счетов учета в базе-приемнике и старайтесь привязывать настройки к видам номенклатуры, а не к иерархическим группам справочника.