Многие пользователи и даже опытные специалисты, переходящие с «1С:Бухгалтерии» на 1C:ERP или «1С:Комплексную автоматизацию» (КА), сталкиваются с пугающим явлением: после массового перепроведения документов или в моменты пиковой нагрузки Оборотно-сальдовая ведомость (ОСВ) может оказаться пустой за огромные периоды времени. Через 10–15 минут данные «самопроизвольно» возвращаются. В рамках этой статьи мы подробно проанализируем, почему это происходит, разберем внутреннюю архитектуру системы и выясним, как настроить программу, чтобы минимизировать подобные инциденты.
Главная причина «пропадания» данных кроется в фундаментальном отличии 1C:ERP от привычной «1С:Бухгалтерии». В обычной бухгалтерии проводки формируются в момент нажатия кнопки «Провести». В ERP-системах используется механизм отложенного формирования проводок. Рассмотрим подробнее, что происходит «под капотом» при проведении документа в 1C:ERP:
Хозрасчетный.Очередь отражения документов в регламентированном учете.Проанализируем ситуацию: если вы запустили массовое перепроведение документов за три года, система сначала очистит проводки по всем этим документам. Пока регламентное задание по формированию проводок не закончит свою работу, в физической таблице регистра бухгалтерии данных действительно не будет. Именно поэтому бухгалтеры видят пустую ОСВ.
Выясним причину того самого «окна» в 15 минут. В 1C:ERP за формирование проводок отвечает регламентное задание Формирование проводок по рег. учету. Если оно настроено на запуск раз в 15 минут, то это и будет минимальным временем ожидания актуализации данных.
Рассмотрим ситуацию высокой нагрузки. При массовой обработке документов очередь отражения может достигать десятков или сотен тысяч записей. Проанализируем технический аспект записи: транзакция по записи большой порции проводок в регистр бухгалтерии может быть очень длительной. Пока транзакция не зафиксирована (Commit), другие пользователи могут не видеть новых записей из-за механизмов блокировок или уровней изоляции транзакций на SQL-сервере.
Многие полагают, что включение опции Отражать документы в рег. учете при проведении (находится в разделе НСИ и администрирование -> Регламентированный учет) решает проблему. Однако разберем по шагам, как это работает на самом деле:
Даже при включенной опции система часто выполняет формирование проводок в фоновом режиме. Это сделано для того, чтобы пользователь не ждал по несколько минут завершения проведения сложного документа, по которому нужно рассчитать себестоимость и сформировать десятки проводок — для решения этой проблемы есть расширение для оперативного расчета себестоимости при проведении в ERP и КА. В результате документ «провелся», форма закрылась, но проводки появятся в базе спустя несколько секунд или минут. В этот интервал отчет по счету будет пустым.
Посмотрим на ситуацию со стороны платформы 1С:Предприятие 8.3. Отчеты типа «Оборотно-сальдовая ведомость» строятся не на прямых запросах к основной таблице движений, а на обращении к виртуальным таблицам оборотов и остатков. Эти таблицы опираются на предварительно рассчитанные итоги.
Проанализируем сценарий: если в системе идет интенсивная запись в регистр бухгалтерии, платформа может временно блокировать доступ к таблицам итогов для их актуализации. В некоторых случаях, если оптимизатор запросов СУБД сталкивается с интенсивным обновлением индексов, запрос к виртуальной таблице может вернуть пустой результат вместо ожидания, чтобы не вызывать критическую блокировку (Deadlock).
Выясним техническую причину, почему данные могут «исчезать» именно при чтении. Если база данных работает на MS SQL Server, критически важно проверить режим Read Committed Snapshot Isolation (RCSI). Посмотрим, как это влияет на работу:
Если бухгалтеру жизненно необходимо увидеть результат проведения «здесь и сейчас», не дожидаясь регламентного задания, разберем стандартный алгоритм действий в 1C:ERP:
Дт/Кт (Проводки регламентированного учета).В этот момент формирование проводок запустится в транзакции клиента, и система будет ждать завершения процесса, после чего сразу покажет результат. Это гарантированный способ получить актуальные данные по конкретному документу.
Для программиста полезно понимать, как программно проверить наличие документов, ожидающих отражения. Рассмотрим пример обращения к регистру сведений ОчередьОтраженияДокументовВРегламентированномУчете:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Очередь.Документ) КАК КолВоДокументов
|ИЗ
| РегистрСведений.ОчередьОтраженияДокументовВРегламентированномУчете КАК Очередь";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Следующий() И Выборка.КолВоДокументов > 0 Тогда
Сообщить("В очереди на отражение в бухучете находится: " + Выборка.КолВоДокументов + " документов.");
КонецЕсли;
Если этот запрос возвращает значимое число, то строить ОСВ преждевременно — данные в ней будут неактуальны или частично отсутствовать.
Проанализировав все причины, выделим комплекс мер по стабилизации отображения данных:
Формирование проводок по рег. учету (например, каждые 30–60 секунд), если ресурсы сервера позволяют.READ_COMMITTED_SNAPSHOT. Это снимет проблему конфликтов чтения и записи.Настройка отражения документов в регламентированном учете. Оно наглядно показывает, сколько документов еще не отражено и по каким причинам возникли ошибки.Таким образом, «исчезновение» данных в 1C:ERP — это не программная ошибка, а следствие работы механизма отложенного проведения. Понимая эту логику, системный администратор и программист могут настроить систему так, чтобы задержки были практически незаметны для конечного пользователя.