В практике работы с конфигурациями на платформе 1С, особенно в медицинских и складских системах (таких как «1С:Медицина. Больничная аптека»), часто возникает необходимость строго соблюдать хронологию товародвижения. Одной из типичных задач является фиксация времени конкретного типа документа на определенный час. Например, чтобы все документы типа Отпуск в отделение записывались строго в 19:00:00. Это позволяет гарантировать, что расходные операции всегда будут следовать после приходных накладных, оформленных в течение дня, что критически важно для корректного списания партий и контроля остатков.
Разберем детально, как реализовать эту задачу, проанализируем различные подходы и выберем наиболее безопасный и современный способ с использованием расширений конфигурации.
Проанализируем ситуацию: если приход товара оформлен в 14:00, а пользователь пытается оформить отпуск этого же товара, но система по умолчанию ставит время документа 09:00 (начало дня) или текущее время, которое может оказаться раньше времени прихода, программа выдаст ошибку «Недостаточно остатка». Чтобы пользователи не тратили время на ручную корректировку секунд и минут, автоматизация этого процесса становится производственной необходимостью. Установка времени на 19:00 делает документ «вечерним», обеспечивая правильную последовательность в журнале.
Самый простой и быстрый способ — внести изменения непосредственно в модуль объекта документа. Рассмотрим базовую логику расчета времени. В системе 1С дата включает в себя и время. Чтобы установить 19 часов, нам нужно получить начало дня и прибавить к нему количество секунд, соответствующее 19 часам (19 * 60 * 60 = 68400 секунд).
Посмотрим на пример кода, который можно разместить в процедуре ПередЗаписью:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Проверяем, что это не загрузка данных, чтобы не нарушить обмен
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Устанавливаем время на 19:00:00
Дата = НачалоДня(Дата) + 68400;
КонецПроцедуры
Важный нюанс: использование обработчика ПередЗаписью предпочтительнее, чем ОбработкаПроведения. Если менять время в момент проведения, то в базе данных документ может сохраниться с одним временем, а в регистрах — с другим, либо потребуется повторная перезапись объекта, что излишне нагружает систему.
Чтобы сохранить конфигурацию на поддержке и избежать сложностей при обновлении программы «1С:Больничная аптека», крайне рекомендуется использовать механизм расширений. Рассмотрим этот процесс по шагам.
ОтпускВОтделение) в основной конфигурации и добавим его в расширение (правой кнопкой мыши — «Добавить в расширение»).&Перед.Проанализируем пример кода для расширения, учитывающий современные стандарты разработки 1С:
&Перед("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Безопасная проверка на режим загрузки
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Используем более наглядный метод платформы
// Устанавливаем время 19 часов 00 минут 00 секунд
Дата = ДобавитьКДате(НачалоДня(Дата), "Час", 19);
КонецПроцедуры
Использование метода ДобавитьКДате вместо арифметических действий с секундами (60*60*19) делает код более читаемым и понятным для других разработчиков.
Как было замечено в обсуждении темы, при работе с отраслевыми решениями (Медицина, Аптека) важно учитывать контекст выполнения кода. Модуль объекта всегда выполняется на сервере, поэтому проблем с доступностью процедур быть не должно. Однако, если вы решите добавить визуальное изменение времени прямо на форме документа, помните, что код модуля формы может отличаться для тонкого клиента.
Для визуального контроля пользователем рекомендуется добавить обработчик события ПриИзменении для реквизита Дата на форме:
&НаКлиенте
Процедура ДатаПриИзменении(Элемент)
// Сразу показываем пользователю итоговое время
Объект.Дата = НачалоДня(Объект.Дата) + 68400;
КонецПроцедуры
Проанализируем ситуацию, когда за один день создается несколько десятков документов отпуска. Если у всех документов будет установлено время ровно 19:00:00, они могут выстроиться в базе данных в случайном порядке. Для партионного учета это может стать проблемой, если важен порядок ввода.
Решение: Вместо жесткого 19:00:00 можно рассмотреть вариант автоматической установки времени в диапазоне этого часа. Однако для большинства задач «Больничной аптеки» фиксации на начало часа достаточно, так как система 1С при одинаковом времени документов ориентируется на момент их физической записи в базу (момент времени).
Если после внедрения кода вы заметили, что дата «пропадает» или время сбрасывается, проверьте следующие моменты:
ПередЗаписью должна принудительно переопределять это поведение.НачалоДня отрабатывает корректно относительно локальной даты документа.Дата (тип Дата, состав Дата и время), а не какой-то дополнительный реквизит.Подводя итог, можно сказать, что решение через расширение с использованием аннотации &Перед("ПередЗаписью") является «золотым стандартом». Оно гарантирует сохранность данных, корректную работу партионного учета и легкость в поддержке конфигурации.