Как автоматизировать исправление ошибок при закрытии месяца в 1С и настроить автопостановку задач исполнителям

Программист 1С v8.3 (Обычные формы) Бухгалтерский учет IT и автоматизация бизнеса
← На главную

Каждый бухгалтер, ответственный за закрытие месяца в 1С, регулярно сталкивается с лавиной ошибок в учете: отрицательные остатки, незаполненная аналитика, нераспределенные затраты, некорректно выбранные счета учета или статьи затрат. Традиционный процесс решения этой проблемы выглядит неэффективно: бухгалтер вручную формирует отчеты, ищет виновных менеджеров, отправляет им письма на электронную почту или звонит по телефону. В ответ исполнители часто игнорируют замечания, ссылаясь на то, что «не видели письма» или «не знали, как исправить».

В этой статье мы подробно разберем, как перевести этот процесс на полностью автоматические рельсы. Мы спроектируем систему, которая будет каждую ночь самостоятельно выявлять ошибки учета, определять ответственных за них сотрудников, ставить им адресные задачи прямо в 1С с интерактивной ссылкой на документ-первопричину и контролировать выполнение.

Архитектура системы автоматического контроля ошибок

Для того чтобы система работала надежно и не вызывала раздражения у пользователей («спам-эффект»), мы должны заложить правильную архитектуру. Полноценное решение состоит из пяти ключевых компонентов:

  1. Регламентное задание проверки: запускается каждую ночь по расписанию, опрашивая базу данных на наличие распространенных ошибок закрытия месяца.
  2. Алгоритм хэширования ошибок: уникальный идентификатор (хэш) для каждой конкретной ошибки. Он позволяет отличать новые ошибки от уже зафиксированных и избегать создания дублирующих задач.
  3. Регистр сведений «Активные ошибки»: хранилище текущих неисправленных проблем, их хэшей, статусов и ответственных лиц.
  4. Механизм исключений (признание корректности): возможность для пользователя пометить ошибку статусом «Так и надо» (например, если продажа ниже себестоимости была согласованной акцией). В этом случае система больше не будет генерировать по ней задачу.
  5. Подсистема автопостановки задач: программное создание объектов типа ЗадачаИсполнителю (из БСП) или интеграция с «1С:Документооборот» с привязкой навигационной ссылки к ошибочному документу.

Шаг 1. Разработка механизма уникального хэширования ошибок

Выясним причину, почему хэширование критически важно. Если запускать проверку каждую ночь, то без хэширования система будет каждое утро создавать новую задачу по одной и той же неисправленной ошибке. Исполнитель получит десятки одинаковых задач, что приведет к саботажу работы с системой задач.

Уникальный хэш должен формироваться на основе трех параметров: ссылка на ошибочный документ, тип ошибки (код проверки) и ключевая аналитика (например, конкретная номенклатура или склад, где возник минус). Рассмотрим пример функции на языке 1С, которая генерирует MD5-хэш на основе этих данных:


Функция СформироватьХэшОшибки(ДокументСсылка, ИдентификаторКонтроля, ДополнительныеДанные = "") Экспорт
    
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.УстановитьСтроку();
    ЗаписьXML.ЗаписатьНачалоЭлемента("ДанныеДляХэша");
    
    // Добавляем уникальный идентификатор документа
    ЗаписьXML.ЗаписатьТекст(Строка(ДокументСсылка.УникальныйИдентификатор()));
    // Добавляем код проверки (например, "ОтрицательныйОстаток" или "НеверныйСчет10")
    ЗаписьXML.ЗаписатьТекст(ИдентификаторКонтроля);
    // Добавляем уточняющую аналитику (код номенклатуры, склада и т.д.)
    ЗаписьXML.ЗаписатьТекст(ДополнительныеДанные);
    
    ЗаписьXML.ЗаписатьКонецЭлемента();
    СтрокаДанных = ЗаписьXML.Закрыть();
    
    // Генерируем MD5-хэш
    Хеширование = Новый ХешированиеДанных(ХешФункция.MD5);
    Хеширование.Добавить(СтрокаДанных);
    
    Возврат Строка(Хеширование.ХешСумма);
    
КонецФункции

Этот хэш мы будем записывать в созданный нами регистр сведений РегистрСведений.ОшибкиУчета. Структура регистра должна быть следующей:

Шаг 2. Автоматическое выявление ошибок и проверка на дубли

Рассмотрим, как должен выглядеть регламентный модуль проверки. Программа выполняет запрос по различным проверкам (например, выявление незаполненных статей затрат в документах производства). Проанализируем пример кода, обрабатывающего результаты проверки и взаимодействующего с нашим регистром сведений:


Процедура ВыполнитьНочнойМониторингОшибок() Экспорт
    
    // Пример запроса по поиску незаполненных статей затрат в производстве
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ВыпускПродукции.Ссылка КАК Документ,
        |   ВыпускПродукции.Ответственный КАК Ответственный,
        |   ВыпускПродукции.ПодразделениеОрганизации КАК Подразделение
        |ИЗ
        |   Документ.ОтчетПроизводстваЗаСмену КАК ВыпускПродукции
        |ГДЕ
        |   ВыпускПродукции.Проведен = ИСТИНА
        |   И ВыпускПродукции.Дата МЕЖДУ &НачалоМесяца И &КонецМесяца
        |   И ВыпускПродукции.Материалы.СтатьяЗатрат = ЗНАЧЕНИЕ(Справочник.СтатьиЗатрат.ПустаяСсылка)";
    
    Запрос.УстановитьПараметр("НачалоМесяца", НачалоМесяца(ТекущаяДата()));
    Запрос.УстановитьПараметр("КонецМесяца", КонецМесяца(ТекущаяДата()));
    
    РезультатЗапроса = Запрос.Выполнить().Выбрать();
    
    Пока РезультатЗапроса.Следующий() Цикл
        
        ИдентификаторКонтроля = "ПустаяСтатьяЗатрат";
        ДопДанные = Строка(РезультатЗапроса.Подразделение.УникальныйИдентификатор());
        Хэш = СформироватьХэшОшибки(РезультатЗапроса.Документ, ИдентификаторКонтроля, ДопДанные);
        
        // Проверяем, есть ли уже такая ошибка в базе
        МенеджерЗаписи = РегистрыСведений.ОшибкиУчета.СоздатьМенеджерЗаписи();
        МенеджерЗаписи.ХэшОшибки = Хэш;
        МенеджерЗаписи.Прочитать();
        
        Если НЕ МенеджерЗаписи.Выбран() Тогда
            // Это новая ошибка. Запишем ее в регистр и создадим задачу
            МенеджерЗаписи.ХэшОшибки = Хэш;
            МенеджерЗаписи.Документ = РезультатЗапроса.Документ;
            МенеджерЗаписи.ТипОшибки = ИдентификаторКонтроля;
            МенеджерЗаписи.Ответственный = РезультатЗапроса.Ответственный;
            МенеджерЗаписи.ОписаниеОшибки = "В документе не заполнена статья затрат в табличной части материалов!";
            МенеджерЗаписи.Статус = Перечисления.СтатусыОшибокИнтеграции.Активна;
            МенеджерЗаписи.ДатаОбнаружения = ТекущаяДата();
            
            // Создаем задачу пользователю в системе задач 1С
            НоваяЗадача = СоздатьЗадачуДляИсполнителя(РезультатЗапроса.Документ, РезультатЗапроса.Ответственный, МенеджерЗаписи.ОписаниеОшибки);
            МенеджерЗаписи.Задача = НоваяЗадача;
            
            МенеджерЗаписи.Записать();
        ИначеЕсли МенеджерЗаписи.Статус = Перечисления.СтатусыОшибокИнтеграции.Разрешена Тогда
            // Ошибка помечена как корректное отклонение, игнорируем ее
            Продолжить;
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

Шаг 3. Программная постановка задачи с привязкой к документу

Для того чтобы исполнитель мог мгновенно перейти к исправлению, мы должны встроить в задачу интерактивную ссылку на ошибочный документ. Разберем по шагам, как программно создать задачу на основе стандартной подсистемы «Бизнес-процессы и задачи» (БСП):


Функция СоздатьЗадачуДляИсполнителя(ДокументСсылка, Исполнитель, ОписаниеОшибки)
    
    Если НЕ ЗначениеЗаполнено(Исполнитель) Тогда
        // Если ответственный не указан, назначаем задачу руководителю подразделения или автору
        Иполнитель = ОпределитьАльтернативногоИсполнителя(ДокументСсылка);
    КонецЕсли;
    
    НоваяЗадача = Задачи.ЗадачаИсполнителю.СоздатьЗадачу();
    НоваяЗадача.Наименование = "Исправление ошибки в документе: " + Строка(ДокументСсылка.Метаданные().Синоним);
    НоваяЗадача.Исполнитель = Исполнитель;
    НоваяЗадача.ДатаНачала = ТекущаяДата();
    НоваяЗадача.СрокИсполнения = ТекущаяДата() + (86400 * 2); // Даем 2 дня на исправление
    НоваяЗадача.Важность = ВариантыВажностиЗадачи.Высокая;
    
    // Формируем навигационную ссылку для быстрого перехода
    НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(ДокументСсылка);
    
    // Заполняем текст задачи
    ТекстОписания = "Внимание! Обнаружена ошибка, препятствующая закрытию месяца." + Символы.ПС + Символы.ПС;
    ТекстОписания = ТекстОписания + "Описание неисправности: " + ОписаниеОшибки + Символы.ПС;
    ТекстОписания = ТекстОписания + "Для перехода к документу нажмите на ссылку ниже:" + Символы.ПС;
    ТекстОписания = ТекстОписания + НавигационнаяСсылка;
    
    НоваяЗадача.Описание = ТекстОписания;
    
    // Привязываем документ к реквизиту Предмет (если такой реквизит есть в конфигурации задач)
    Попытка
        НоваяЗадача.Предмет = ДокументСсылка;
    Исключение
        // Если реквизита Предмет нет, используем свойства БСП для привязки объектов
    КонецПопытки;
    
    НоваяЗадача.Записать();
    
    Возврат НоваяЗадача.Ссылка;
    
КонецФункции

Шаг 4. Обратная связь: автоматическое закрытие задач при исправлении

Важно не только ставить задачи, но и своевременно снимать их при исправлении документов пользователями. Это также делается в рамках ночной проверки:

  1. Регламентное задание перед началом поиска новых ошибок считывает все записи в регистре ОшибкиУчета со статусом «Активна».
  2. Для каждой записи повторно запускается алгоритм проверки конкретного документа.
  3. Если при повторной проверке ошибка больше не обнаруживается, это означает, что пользователь зашел в документ и исправил его.
  4. В этом случае программа программно отмечает задачу исполнителя как выполненную (ЗадачаОбъект.ВыполнитьЗадачу()) и удаляет запись из регистра ОшибкиУчета (или переводит ее в архив).

Рассмотрим пример кода, реализующий этот автоматический контроль исправления:


Процедура ПроверитьИсправлениеОшибок() Экспорт
    
    Запрос = Новый Запрос;
    Запрос.Text = 
        "ВЫБРАТЬ
        |   Ошибки.ХэшОшибки КАК ХэшОшибки,
        |   Ошибки.Документ КАК Документ,
        |   Ошибки.Задача КАК Задача,
        |   Ошибки.ТипОшибки КАК ТипОшибки
        |ИЗ
        |   РегистрСведений.ОшибкиУчета КАК Ошибки
        |ГДЕ
        |   Ошибки.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыОшибокИнтеграции.Активна)";
        
    Результат = Запрос.Выполнить().Выбрать();
    
    Пока Результат.Следующий() Цикл
        
        // Вызываем функцию проверки документа по типу ошибки
        ОшибкаИсправлена = ПроверитьДокументНаНаличиеОшибки(Результат.Документ, Результат.ТипОшибки);
        
        Если ОшибкаИсправлена Тогда
            // Снимаем задачу
            Если ЗначениеЗаполнено(Результат.Задача) Тогда
                ЗадачаОбъект = Результат.Задача.ПолучитьОбъект();
                Если НЕ ЗадачаОбъект.Выполнена Тогда
                    ЗадачаОбъект.ВыполнитьЗадачу();
                КонецЕсли;
            КонецЕсли;
            
            // Удаляем ошибку из регистра
            МенеджерЗаписи = РегистрыСведений.ОшибкиУчета.СоздатьМенеджерЗаписи();
            МенеджерЗаписи.ХэшОшибки = Результат.ХэшОшибки;
            МенеджерЗаписи.Удалить();
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

Шаг 5. Реализация контроля на этапе ввода данных

Самый эффективный способ избавиться от аврала в конце месяца — это пресекать появление ошибок непосредственно в момент проведения документов. Мы можем использовать механизм подписок на события БСП:

Преимущества встроенного инструмента тестирования в современных версиях 1С:ERP и КА 2

Если вы работаете в современных конфигурациях на управляемых формах, таких как 1С:ERP Управление предприятием или Комплексная автоматизация 2, вам доступен мощнейший штатный инструмент — «Тестирование операций закрытия месяца».

Данная служебная обработка позволяет выполнять эмуляцию полного расчета себестоимости и закрытия месяца на виртуальных таблицах в фоновом режиме, абсолютно не мешая текущей операционной работе пользователей. Она выявляет разрывы партионного учета, зависшие остатки на регистрах накопления и логические ошибки распределения затрат задолго до официального старта закрытия периода.

Мы рекомендуем настроить регулярный ночной запуск данной обработки по расписанию. Выгружаемые лог-файлы результатов тестирования можно автоматически парсить с помощью регламентного скрипта и использовать в качестве источника для автоматической рассылки и постановки задач, описанных в Шаге 3.

Организационные и административные методы мотивации

Любая, даже самая совершенная ИТ-система контроля окажется неэффективной, если у сотрудников нет жесткой регламентированной ответственности за игнорирование задач. Посмотрим, как успешно связать техническую сторону с административной практикой:

  1. Контроль просроченных задач: используйте встроенный отчет по просроченным задачам исполнителей. Данный отчет должен автоматически отправляться руководителям подразделений каждый понедельник.
  2. Связь с KPI и премированием: введите KPI-показатель «Процент своевременно закрытых задач по учетным ошибкам». Если у сотрудника на дату закрытия месяца (например, на 5-е число следующего месяца) висит хотя бы одна просроченная задача по исправлению документов, его переменная часть заработной платы (премия) пропорционально снижается.
  3. Контроль версионирования объектов: включите стандартный механизм версионирования объектов для ключевых документов. Это позволит службе бухгалтерии в любой момент аргументированно доказать руководству, кто именно зашел «задним числом» в закрытый период и сломал рассчитанную себестоимость.

Внедрение комплексного подхода, сочетающего автоматическое ночное хэширование ошибок в 1С, автопостановку адресных задач исполнителям и административные регламенты, позволяет сократить время закрытия отчетного периода с нескольких недель до одного-двух дней, навсегда избавив бухгалтерию от рутинного поиска виновных.

← На главную