Ситуация, когда в программе «самопроизвольно» меняются данные в проведенных документах, является одной из самых стрессовых для администратора системы или программиста. Рассмотрим детально случай из практики работы с конфигурацией «Управление торговлей 10.3» на платформе 8.2 (файловый вариант), когда после создания документа РеализацияТоваровУслуг из исходного документа ЗаказПокупателя пропадает часть номенклатурных позиций. Проанализируем причины этого явления, методы диагностики и способы предотвращения подобных инцидентов.
Первым делом, когда возникает подозрение на программный сбой или несанкционированное изменение данных, мы должны обратиться к Журналу регистрации. Это главный инструмент аудита в 1С. Разберем, на что именно стоит обратить внимание.
В нашем случае в журнале фиксируются записи Изменение и Проведение документа ЗаказПокупателя спустя всего несколько секунд после того, как была создана РеализацияТоваровУслуг. На первый взгляд кажется, что это делает сама система. Однако при детальном изучении записей журнала регистрации важно обращать внимание не только на колонку «Пользователь», но и на колонку «Рабочее место» (или имя компьютера).
Выясним причину: если идентификатор компьютера в записи об изменении отличается от того, за которым сидит основной менеджер, значит, под этой же учетной записью в базу вошел кто-то другой. В файловых версиях 1С часто практикуется использование общих логинов, что является грубой ошибкой безопасности. Проанализируем ситуацию: менеджер №1 создал заказ, а менеджер №2 на другом терминале зашел под тем же логином и отредактировал документ (например, чтобы «перехватить» дефицитный товар для своего клиента), при этом менеджер №1 уверен, что «оно само».
Если журнал регистрации подтверждает, что изменения происходят в момент проведения связанных документов, нам необходимо проверить наличие доработок в конфигурации. Рассмотрим пошагово, как это сделать:
ЗаказПокупателя.ПередЗаписью, ПриЗаписи и ОбработкаПроведения. Если в системе есть подписка, которая реагирует на запись документа РеализацияТоваровУслуг и при этом программно меняет родительский ЗаказПокупателя, это будет видно в коде.ЗаказПокупателя в процедуре ПередЗаписью.Пример кода, который может быть внедрен в систему и вызывать удаление строк (использовать с осторожностью только для анализа):
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Пример вредоносного или ошибочного кода
Если ЭтотОбъект.Проведен Тогда
Индекс = Товары.Количество() - 1;
Пока Индекс >= 0 Цикл
СтрокаТЧ = Товары[Индекс];
// Например, кто-то решил удалять строки, по которым нет остатка
Если СтрокаТЧ.Количество == 0 Тогда
Товары.Удалить(СтрокаТЧ);
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Проанализируем технический аспект. В файловом режиме (.1CD) при одновременной работе пользователей могут возникать конфликты блокировок. Хотя платформа 8.2 достаточно стабильна, существует вероятность возникновения «состояния гонки» (race condition). Если два сеанса под одним пользователем одновременно пытаются записать один и тот же объект, данные могут быть перезаписаны устаревшей версией из кэша одного из сеансов.
Также стоит учитывать кеширование данных. В редких случаях после динамического обновления конфигурации кэш на клиентских машинах может работать некорректно, «подсовывая» старые алгоритмы обработки табличных частей. Рекомендуется периодически очищать локальный кэш пользователей (папки %AppData%\1C\1Cv82).
Выясним мотивацию сотрудников. В 1С:УТ 10.3 ключевым механизмом является резервирование товаров. Заказ покупателя может делать записи в регистр накопления ТоварыВРезервеНаСкладах. Если в компании острый дефицит товара, менеджеры могут идти на хитрость:
В результате у первого менеджера в Реализации (которая уже была сформирована или печаталась) товар есть, а в Заказе после «тихого» редактирования вторым менеджером — строк уже меньше. Это создает расхождения в аналитических отчетах, таких как «Анализ заказов покупателей».
Чтобы навсегда прекратить споры «кто удалил строку», рассмотрим внедрение версионирования объектов. В типовой УТ 10.3 встроенного механизма версионирования в том виде, как в БСП (Библиотеке стандартных подсистем) для 8.3, может не быть. Однако его можно добавить с помощью сторонних разработок или подписок на события.
Разберем принцип работы простейшего логирования изменений табличной части Товары:
Процедура ПриЗаписи(Отказ)
// Записываем старое и новое состояние документа в специальный регистр
// Это позволит увидеть, кто именно, когда и какие строки удалил
Для Каждого СтрокаТЧ Из Товары Цикл
// Логика сравнения версий...
КонецЦикла;
КонецПроцедуры
Если полноценное версионирование внедрять долго, можно использовать временную меру: запрет на редактирование заказов после того, как на их основании создана реализация. Это настраивается через Роли в конфигураторе или через дополнительные права пользователей в режиме 1С:Предприятие.
Проанализируем, к чему ведут такие изменения в Заказе покупателя при наличии проведенной Реализации:
ЗаказыПокупателей. Виртуальный «долг» по заказу будет висеть в базе вечно.Для решения проблемы «пропадающих строк» выполним следующие действия:
ЗаказПокупателя в закрытых периодах или при наличии связанных документов отгрузки.ПриЗаписи на предмет программного удаления пустых строк или строк с нулевой ценой, что часто зашивается в систему как «автоматическая чистка».Таким образом, мы выяснили, что в 99% случаев проблема не в «глюке» программы, а в человеческом факторе или некорректно настроенных бизнес-процессах внутри системы. Использование журнала регистрации в сочетании с пониманием механизмов резервирования позволяет быстро найти виновного и восстановить целостность учета.