Переход на новые релизы программных продуктов семейства «1С:Предприятие» часто преподносит сюрпризы разработчикам и обслуживающим программистам. Одним из наиболее частых последствий кардинального обновления конфигурации является поломка внешних отчетов и обработок, которые верой и правдой служили годами. Особенно остро это ощущается при работе с конфигурацией «1С:Зарплата и управление персоналом» (ЗУП) редакции 3.1.
В этой статье мы подробно разберем, почему после обновления конфигурации (например, при переходе с ветки 3.1.2 на 3.1.5 и выше) внешняя обработка или отчет внезапно прекращает формирование данных и вылетает со строгой системной ошибкой: «Не найден внешний набор данных НачисленияУдержанияДокумента». Мы выясним глубинную причину этой проблемы, проанализируем архитектурные изменения в логике «1С» и рассмотрим пошаговые инструкции по исправлению ситуации как для разработчиков, так и для рядовых пользователей системы.
Для начала давайте разберемся, из-за чего возник этот сбой. Начиная с версий 3.1.4 и 3.1.5, фирма «1С» провела глубокую реструктуризацию внутренних механизмов формирования отчетов по заработной плате. Под раздачу попали такие ключевые и самые популярные отчеты, как «Расчетный листок», «Анализ начислений и удержаний», «Расчетная ведомость» и другие.
Ранее сбор сведений производился с помощью массивных и достаточно тяжелых запросов непосредственно внутри схемы компоновки данных (СКД). С ростом объема баз данных этот подход начал вызывать существенные проблемы с производительностью. Чтобы оптимизировать быстродействие системы, разработчики пошли по пути программного формирования временных таблиц.
Теперь данные собираются и подготавливаются программно в недрах общих модулей конфигурации, после чего они передаются в СКД в качестве внешних наборов данных (наборы данных с типом Объект). Одним из таких новых обязательных наборов данных и стал набор с именем НачисленияУдержанияДокумента. Он функционирует в паре с базовым набором НачисленияУдержания и отвечает за детальную расшифровку всех расчетов в разрезе документов-регистраторов.
Если ваша внешняя обработка или отчет используют механизмы СКД, заимствованные из старой версии ЗУП, или напрямую вызывают общие модули конфигурации для заполнения источников данных, то возникает жесткий конфликт интересов:
НачисленияУдержанияДокумента. Но в модуле внешней обработки при инициализации процессора компоновки передается только старая структура (например, только таблица начислений). Процессор компоновки не находит требуемую таблицу и прерывает работу с ошибкой.Давайте проведем совместную работу по поиску проблемного участка кода. Если при формировании выгрузки или отчета вы видите сообщение об ошибке, первым делом необходимо запустить систему в режиме отладки. Нам нужно точно понять, где именно «падает» код.
Разберем по шагам процесс настройки отладки:
-debug.F5), откройте проблемную внешнюю обработку и запустите процедуру выгрузки или формирования.При возникновении ошибки отладчик автоматически остановит выполнение кода. Как правило, остановка происходит в модуле объекта обработки или общем модуле на строке инициализации процессора компоновки данных:
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, ВнешниеНаборыДанных, ДанныеРасшифровки);
В этот момент мы можем детально исследовать переменную ВнешниеНаборыДанных. Это коллекция типа Структура. Обратите внимание, какие ключи содержатся в этой структуре и сопоставьте их со списком наборов данных в вашей схеме компоновки данных.
Убедившись, что проблема действительно в отсутствии передачи таблицы НачисленияУдержанияДокумента, перейдем к редактированию кода внешней обработки в Конфигураторе.
Рассмотрим подробнее два сценария решения этой проблемы.
Если ваш отчет или обработка использует собственный макет СКД, нам потребуется выполнить следующие действия:
НачисленияУдержанияДокумента. Если его там нет, его необходимо добавить. Убедитесь, что имя набора данных в точности совпадает с ожидаемым системой.
// Создаем структуру для передачи внешних наборов данных
ВнешниеНаборыДанных = Новый Структура;
// Допустим, у нас уже формируется основная таблица начислений
ТаблицаНачислений = ПолучитьТаблицуНачислений();
ВнешниеНаборыДанных.Вставить("НачисленияУдержания", ТаблицаНачислений);
// Решаем проблему: создаем и инициализируем структуру для нового набора данных
// В простейшем случае, если детальная информация по регистраторам не требуется,
// мы можем передать пустую таблицу с аналогичной структурой колонок
ТаблицаДокументов = ТаблицаНачислений.СкопироватьКолонки();
ВнешниеНаборыДанных.Вставить("НачисленияУдержанияДокумента", ТаблицаДокументов);
// Инициализируем процессор компоновки без ошибок
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, ВнешниеНаборыДанных, ДанныеРасшифровки);
Поскольку в современных версиях ЗУП 3.1 разработчики «1С» предоставили готовые интерфейсы для работы с отчетами по заработной плате, крайне рекомендуется задействовать штатные функции. Для автоматического заполнения структуры внешних источников в новых релизах конфигурации предназначен специальный общий модуль.
Давайте посмотрим на пример использования функции динамического заполнения источников данных:
// Для автоматического сбора всех необходимых таблиц (включая НачисленияУдержанияДокумента)
// используем вызов типового метода конфигурации ЗУП
ПараметрыОтчета = Новый Структура;
// Заполняем параметры отчета (период, организация, сотрудники и т.д.)
ПараметрыОтчета.Вставить("НачалоПериода", ПериодРегистрации);
ПараметрыОтчета.Вставить("КонецПериода", КонецПериода(ПериодРегистрации, "Месяц"));
// Вызываем метод типовой конфигурации для подготовки всех источников данных
ДанныеОтчета = ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбщиеИсточникиДанныхОтчета(ПараметрыОтчета);
// Теперь структура "ДанныеОтчета" гарантированно содержит все требуемые таблицы,
// включая искомый набор "НачисленияУдержанияДокумента"
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, ДанныеОтчета, ДанныеРасшифровки);
Такой подход защитит вашу обработку от будущих обновлений конфигурации, поскольку всю грязную работу по формированию структуры таблиц берет на себя сама система 1С.
Бывают ситуации, когда точно такая же ошибка («Не найден внешний набор данных НачисленияУдержанияДокумента») возникает при формировании типовых, не измененных отчетов после рядового обновления базы данных. Например, при попытке сформировать отчет «Анализ зарплаты по сотрудникам» или расчетные листки.
Это происходит по причине конфликта старых кэшированных пользовательских настроек со структурой новой конфигурации. Давайте разберем три шага для быстрого исправления этой проблемы:
В большинстве случаев это самое быстрое и эффективное решение. Пользователю не требуются права программиста.
Если сброс настроек внутри программы не помог, вероятно, платформа сохранила старое представление схемы компоновки данных в локальном кэше на компьютере пользователя.
/ClearCache.Если вышеописанные методы не принесли желаемого результата, возможно, при обновлении базы данных произошел сбой в таблицах конфигурации. Нам потребуется выполнить профилактические работы в режиме Конфигуратора.
Мы детально проанализировали проблему, нашли ее корни в архитектуре обновления 1С:ЗУП 3.1 и рассмотрели комплексные методы борьбы с ошибкой отсутствия внешних наборов данных. Своевременное обновление кода ваших обработок и регулярная профилактика кэша гарантируют стабильную и быструю работу вашей учетной системы.