Каждый бухгалтер, ответственный за закрытие месяца в 1С, регулярно сталкивается с лавиной ошибок в учете: отрицательные остатки, незаполненная аналитика, нераспределенные затраты, некорректно выбранные счета учета или статьи затрат. Традиционный процесс решения этой проблемы выглядит неэффективно: бухгалтер вручную формирует отчеты, ищет виновных менеджеров, отправляет им письма на электронную почту или звонит по телефону. В ответ исполнители часто игнорируют замечания, ссылаясь на то, что «не видели письма» или «не знали, как исправить».
В этой статье мы подробно разберем, как перевести этот процесс на полностью автоматические рельсы. Мы спроектируем систему, которая будет каждую ночь самостоятельно выявлять ошибки учета, определять ответственных за них сотрудников, ставить им адресные задачи прямо в 1С с интерактивной ссылкой на документ-первопричину и контролировать выполнение.
Для того чтобы система работала надежно и не вызывала раздражения у пользователей («спам-эффект»), мы должны заложить правильную архитектуру. Полноценное решение состоит из пяти ключевых компонентов:
ЗадачаИсполнителю (из БСП) или интеграция с «1С:Документооборот» с привязкой навигационной ссылки к ошибочному документу.Выясним причину, почему хэширование критически важно. Если запускать проверку каждую ночь, то без хэширования система будет каждое утро создавать новую задачу по одной и той же неисправленной ошибке. Исполнитель получит десятки одинаковых задач, что приведет к саботажу работы с системой задач.
Уникальный хэш должен формироваться на основе трех параметров: ссылка на ошибочный документ, тип ошибки (код проверки) и ключевая аналитика (например, конкретная номенклатура или склад, где возник минус). Рассмотрим пример функции на языке 1С, которая генерирует MD5-хэш на основе этих данных:
Функция СформироватьХэшОшибки(ДокументСсылка, ИдентификаторКонтроля, ДополнительныеДанные = "") Экспорт
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ЗаписьXML.ЗаписатьНачалоЭлемента("ДанныеДляХэша");
// Добавляем уникальный идентификатор документа
ЗаписьXML.ЗаписатьТекст(Строка(ДокументСсылка.УникальныйИдентификатор()));
// Добавляем код проверки (например, "ОтрицательныйОстаток" или "НеверныйСчет10")
ЗаписьXML.ЗаписатьТекст(ИдентификаторКонтроля);
// Добавляем уточняющую аналитику (код номенклатуры, склада и т.д.)
ЗаписьXML.ЗаписатьТекст(ДополнительныеДанные);
ЗаписьXML.ЗаписатьКонецЭлемента();
СтрокаДанных = ЗаписьXML.Закрыть();
// Генерируем MD5-хэш
Хеширование = Новый ХешированиеДанных(ХешФункция.MD5);
Хеширование.Добавить(СтрокаДанных);
Возврат Строка(Хеширование.ХешСумма);
КонецФункции
Этот хэш мы будем записывать в созданный нами регистр сведений РегистрСведений.ОшибкиУчета. Структура регистра должна быть следующей:
ХэшОшибки (Строка, 32 символа).Документ (ЛюбаяСсылка), ТипОшибки (Строка), Ответственный (СправочникСсылка.Пользователи), ОписаниеОшибки (Строка), Статус (ПеречислениеСсылка.СтатусыОшибокИнтеграции — значения: "Активна", "Разрешена"), ДатаОбнаружения (Дата), Задача (ЗадачаСсылка.ЗадачаИсполнителю).Рассмотрим, как должен выглядеть регламентный модуль проверки. Программа выполняет запрос по различным проверкам (например, выявление незаполненных статей затрат в документах производства). Проанализируем пример кода, обрабатывающего результаты проверки и взаимодействующего с нашим регистром сведений:
Процедура ВыполнитьНочнойМониторингОшибок() Экспорт
// Пример запроса по поиску незаполненных статей затрат в производстве
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВыпускПродукции.Ссылка КАК Документ,
| ВыпускПродукции.Ответственный КАК Ответственный,
| ВыпускПродукции.ПодразделениеОрганизации КАК Подразделение
|ИЗ
| Документ.ОтчетПроизводстваЗаСмену КАК ВыпускПродукции
|ГДЕ
| ВыпускПродукции.Проведен = ИСТИНА
| И ВыпускПродукции.Дата МЕЖДУ &НачалоМесяца И &КонецМесяца
| И ВыпускПродукции.Материалы.СтатьяЗатрат = ЗНАЧЕНИЕ(Справочник.СтатьиЗатрат.ПустаяСсылка)";
Запрос.УстановитьПараметр("НачалоМесяца", НачалоМесяца(ТекущаяДата()));
Запрос.УстановитьПараметр("КонецМесяца", КонецМесяца(ТекущаяДата()));
РезультатЗапроса = Запрос.Выполнить().Выбрать();
Пока РезультатЗапроса.Следующий() Цикл
ИдентификаторКонтроля = "ПустаяСтатьяЗатрат";
ДопДанные = Строка(РезультатЗапроса.Подразделение.УникальныйИдентификатор());
Хэш = СформироватьХэшОшибки(РезультатЗапроса.Документ, ИдентификаторКонтроля, ДопДанные);
// Проверяем, есть ли уже такая ошибка в базе
МенеджерЗаписи = РегистрыСведений.ОшибкиУчета.СоздатьМенеджерЗаписи();
МенеджерЗаписи.ХэшОшибки = Хэш;
МенеджерЗаписи.Прочитать();
Если НЕ МенеджерЗаписи.Выбран() Тогда
// Это новая ошибка. Запишем ее в регистр и создадим задачу
МенеджерЗаписи.ХэшОшибки = Хэш;
МенеджерЗаписи.Документ = РезультатЗапроса.Документ;
МенеджерЗаписи.ТипОшибки = ИдентификаторКонтроля;
МенеджерЗаписи.Ответственный = РезультатЗапроса.Ответственный;
МенеджерЗаписи.ОписаниеОшибки = "В документе не заполнена статья затрат в табличной части материалов!";
МенеджерЗаписи.Статус = Перечисления.СтатусыОшибокИнтеграции.Активна;
МенеджерЗаписи.ДатаОбнаружения = ТекущаяДата();
// Создаем задачу пользователю в системе задач 1С
НоваяЗадача = СоздатьЗадачуДляИсполнителя(РезультатЗапроса.Документ, РезультатЗапроса.Ответственный, МенеджерЗаписи.ОписаниеОшибки);
МенеджерЗаписи.Задача = НоваяЗадача;
МенеджерЗаписи.Записать();
ИначеЕсли МенеджерЗаписи.Статус = Перечисления.СтатусыОшибокИнтеграции.Разрешена Тогда
// Ошибка помечена как корректное отклонение, игнорируем ее
Продолжить;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Для того чтобы исполнитель мог мгновенно перейти к исправлению, мы должны встроить в задачу интерактивную ссылку на ошибочный документ. Разберем по шагам, как программно создать задачу на основе стандартной подсистемы «Бизнес-процессы и задачи» (БСП):
Функция СоздатьЗадачуДляИсполнителя(ДокументСсылка, Исполнитель, ОписаниеОшибки)
Если НЕ ЗначениеЗаполнено(Исполнитель) Тогда
// Если ответственный не указан, назначаем задачу руководителю подразделения или автору
Иполнитель = ОпределитьАльтернативногоИсполнителя(ДокументСсылка);
КонецЕсли;
НоваяЗадача = Задачи.ЗадачаИсполнителю.СоздатьЗадачу();
НоваяЗадача.Наименование = "Исправление ошибки в документе: " + Строка(ДокументСсылка.Метаданные().Синоним);
НоваяЗадача.Исполнитель = Исполнитель;
НоваяЗадача.ДатаНачала = ТекущаяДата();
НоваяЗадача.СрокИсполнения = ТекущаяДата() + (86400 * 2); // Даем 2 дня на исправление
НоваяЗадача.Важность = ВариантыВажностиЗадачи.Высокая;
// Формируем навигационную ссылку для быстрого перехода
НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(ДокументСсылка);
// Заполняем текст задачи
ТекстОписания = "Внимание! Обнаружена ошибка, препятствующая закрытию месяца." + Символы.ПС + Символы.ПС;
ТекстОписания = ТекстОписания + "Описание неисправности: " + ОписаниеОшибки + Символы.ПС;
ТекстОписания = ТекстОписания + "Для перехода к документу нажмите на ссылку ниже:" + Символы.ПС;
ТекстОписания = ТекстОписания + НавигационнаяСсылка;
НоваяЗадача.Описание = ТекстОписания;
// Привязываем документ к реквизиту Предмет (если такой реквизит есть в конфигурации задач)
Попытка
НоваяЗадача.Предмет = ДокументСсылка;
Исключение
// Если реквизита Предмет нет, используем свойства БСП для привязки объектов
КонецПопытки;
НоваяЗадача.Записать();
Возврат НоваяЗадача.Ссылка;
КонецФункции
Важно не только ставить задачи, но и своевременно снимать их при исправлении документов пользователями. Это также делается в рамках ночной проверки:
ОшибкиУчета со статусом «Активна».ЗадачаОбъект.ВыполнитьЗадачу()) и удаляет запись из регистра ОшибкиУчета (или переводит ее в архив).Рассмотрим пример кода, реализующий этот автоматический контроль исправления:
Процедура ПроверитьИсправлениеОшибок() Экспорт
Запрос = Новый Запрос;
Запрос.Text =
"ВЫБРАТЬ
| Ошибки.ХэшОшибки КАК ХэшОшибки,
| Ошибки.Документ КАК Документ,
| Ошибки.Задача КАК Задача,
| Ошибки.ТипОшибки КАК ТипОшибки
|ИЗ
| РегистрСведений.ОшибкиУчета КАК Ошибки
|ГДЕ
| Ошибки.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыОшибокИнтеграции.Активна)";
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
// Вызываем функцию проверки документа по типу ошибки
ОшибкаИсправлена = ПроверитьДокументНаНаличиеОшибки(Результат.Документ, Результат.ТипОшибки);
Если ОшибкаИсправлена Тогда
// Снимаем задачу
Если ЗначениеЗаполнено(Результат.Задача) Тогда
ЗадачаОбъект = Результат.Задача.ПолучитьОбъект();
Если НЕ ЗадачаОбъект.Выполнена Тогда
ЗадачаОбъект.ВыполнитьЗадачу();
КонецЕсли;
КонецЕсли;
// Удаляем ошибку из регистра
МенеджерЗаписи = РегистрыСведений.ОшибкиУчета.СоздатьМенеджерЗаписи();
МенеджерЗаписи.ХэшОшибки = Результат.ХэшОшибки;
МенеджерЗаписи.Удалить();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Самый эффективный способ избавиться от аврала в конце месяца — это пресекать появление ошибок непосредственно в момент проведения документов. Мы можем использовать механизм подписок на события БСП:
ОбработкаПроведения для ключевых документов оперативного учета (таких как «Требование-накладная», «Отчет производства за смену», «Реализация товаров и услуг»).Если вы работаете в современных конфигурациях на управляемых формах, таких как 1С:ERP Управление предприятием или Комплексная автоматизация 2, вам доступен мощнейший штатный инструмент — «Тестирование операций закрытия месяца».
Данная служебная обработка позволяет выполнять эмуляцию полного расчета себестоимости и закрытия месяца на виртуальных таблицах в фоновом режиме, абсолютно не мешая текущей операционной работе пользователей. Она выявляет разрывы партионного учета, зависшие остатки на регистрах накопления и логические ошибки распределения затрат задолго до официального старта закрытия периода.
Мы рекомендуем настроить регулярный ночной запуск данной обработки по расписанию. Выгружаемые лог-файлы результатов тестирования можно автоматически парсить с помощью регламентного скрипта и использовать в качестве источника для автоматической рассылки и постановки задач, описанных в Шаге 3.
Любая, даже самая совершенная ИТ-система контроля окажется неэффективной, если у сотрудников нет жесткой регламентированной ответственности за игнорирование задач. Посмотрим, как успешно связать техническую сторону с административной практикой:
Внедрение комплексного подхода, сочетающего автоматическое ночное хэширование ошибок в 1С, автопостановку адресных задач исполнителям и административные регламенты, позволяет сократить время закрытия отчетного периода с нескольких недель до одного-двух дней, навсегда избавив бухгалтерию от рутинного поиска виновных.