Как в документе Заказ покупателя добавить ячейку с счетчиком от 1 до 3 для распределения между рабочими

Программист 1С v8.3 (Обычные формы) Управленческий учет Промышленность, строительство и АПК
← На главную

В производственных процессах часто возникает задача автоматического распределения заданий между сотрудниками. Типичный сценарий: есть три мастера, и каждый новый Заказ покупателя должен по очереди назначаться одному из них (первому, второму, третьему, затем снова первому). Это позволяет избежать субъективности при назначении ответственных и автоматизировать процесс подготовки печатных форм «Заявка».

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

Вариант 1: Использование константы для хранения текущего состояния

Это наиболее надежный и простой в реализации метод. Его суть заключается в том, что в системе хранится некое «состояние» — номер последнего назначенного рабочего. При создании нового документа мы считываем это число, увеличиваем его на единицу и записываем обратно.

Рассмотрим алгоритм реализации:

  1. Создадим в конфигураторе Константу (например, НомерПоследнегоМастера) с типом Число.
  2. В модуле объекта документа ЗаказПокупателя пропишем логику в процедуре ПередЗаписью.

Проанализируем пример кода для этого решения:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    
    // Выполняем назначение только для НОВЫХ документов
    Если ЭтоНовый() Тогда
        
        // Получаем текущее значение из константы
        ТекущийНомер = Константы.НомерПоследнегоМастера.Получить();
        
        // Вычисляем следующий номер
        НовыйНомер = ТекущийНомер + 1;
        
        // Если рабочих трое, то после 3 возвращаемся к 1
        Если НовыйНомер > 3 Тогда
            НовыйНомер = 1;
        КонецЕсли;
        
        // Назначаем номер в нужный реквизит документа (например, ОтветственныйЗаказа)
        // Если реквизит числовой, пишем число. Если текстовый - преобразуем.
        ЭтотОбъект.ОтветственныйЗаказа = НовыйНомер;
        
        // Сохраняем обновленное значение счетчика в базу
        Константы.НомерПоследнегоМастера.Установить(НовыйНомер);
        
    КонецЕсли;

КонецПроцедуры

Важный нюанс: Чтобы избежать ситуации, когда два менеджера одновременно сохраняют заказы и получают один и тот же номер, желательно использовать механизм блокировок или выполнять чтение и установку константы в одной транзакции.

Вариант 2: Расчет на основании номера документа (Математический метод)

Если вы не хотите добавлять в конфигурацию новые объекты (константы или регистры), можно воспользоваться логикой вычисления остатка от деления номера документа. Это «костыльный», но рабочий метод, который не требует хранения состояния.

Разберем, как это работает. Каждый документ в 1С имеет уникальный номер. Если мы очистим номер от префиксов (букв) и превратим его в число, то сможем применить формулу Номер % 3 (остаток от деления на 3). Результатом всегда будет 0, 1 или 2.

Посмотрим на пример функции, которая вычисляет номер мастера:


Функция ПолучитьНомерМастераИзНомераДокумента(ТекНомер)
    
    НомерБезБукв = "";
    Для Инд = 1 По СтрДлина(ТекНомер) Цикл
        ТекСимвол = Сред(ТекНомер, Инд, 1);
        Если СтрНайти("0123456789", ТекСимвол) > 0 Тогда
            НомерБезБукв = НомерБезБукв + ТекСимвол;
        КонецЕсли;
    КонецЦикла;
    
    НомерЧислом = Число(НомерБезБукв);
    Остаток = НомерЧислом % 3;
    
    // Приводим остаток к формату 1, 2, 3
    Если Остаток = 0 Тогда
        Возврат 3;
    Иначе
        Возврат Остаток;
    КонецЕсли;
    
КонецФункции

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

Вариант 3: Использование регистра сведений для гибкого управления

Если в будущем количество рабочих может меняться, лучше использовать Регистр сведений. В нем можно хранить не просто цифру, а ссылку на конкретного сотрудника из справочника ФизическиеЛица.

Преимущества этого подхода:

Рассмотрим логику работы с регистром:

  1. Создаем регистр ИсторияРаспределенияЗаказов.
  2. При создании заказа находим в регистре последнюю запись.
  3. Определяем, кто следует за этим сотрудником в общем списке мастеров.
  4. Записываем данные о новом назначении в регистр и в документ.

Технические рекомендации по внедрению

Выясним, на что нужно обратить внимание при написании кода, чтобы система работала стабильно:

1. Точка входа в код. Используйте событие ПередЗаписью в модуле объекта. Обязательно проверяйте условие ЭтоНовый(). Если этого не сделать, то при каждом перепроведении старого заказа номер мастера будет меняться на следующий, что недопустимо.

2. Работа с «задним числом». Если документы вводятся не оперативно, а за прошлые даты, метод со счетчиком в константе все равно будет работать корректно, так как он ориентируется на момент физического нажатия кнопки «Записать», а не на дату документа.

3. Блокировки данных. В высоконагруженных системах, где заказы создаются каждую секунду несколькими пользователями, используйте БлокировкаДанных. Это гарантирует, что два пользователя не прочитают одну и ту же константу одновременно.

4. Печатная форма. Чтобы рабочий увидел свой номер, не забудьте отредактировать макет печатной формы «Заявка». Добавьте в область заголовка или подвала параметр (например, НомерМастера) и передавайте туда значение из созданного вами реквизита документа.

Подводя итог, можно сказать, что наиболее сбалансированным решением для небольшой организации является Вариант 1 (с константой). Он прост в поддержке и обеспечивает достаточно точное распределение нагрузки. Если же производство крупное и требует учета отпусков и графиков, следует смотреть в сторону Регистра сведений.

← На главную