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