Как настроить дробную нумерацию счетов в 1С:Предприятие 7.7?

Программист 1С v7.7 1C:Бухгалтерия Управленческий учет
← На главную

При работе в конфигурации 1С:Предприятие 7.7 часто возникает потребность в детализации счетов на оплату. Например, если у вас есть основной счет на крупную сумму, а контрагенту нужно выставлять частичные счета в течение года. В этой статье мы разберем, как реализовать механизм дробной нумерации (например, 10/1, 10/2) с сохранением автоматического подбора номера.

Шаг 1: Подготовка конфигурации

Поскольку в 1С 7.7 номер документа является строковым полем, первое, что нам необходимо сделать — это увеличить его длину. По умолчанию длина номера может составлять 6 символов, чего будет недостаточно для хранения конструкции вида 0001/1. Зайдите в конфигуратор, найдите документ Счет, перейдите в свойства реквизита НомерДок и увеличьте его длину, например, до 8 или 10 символов. Будьте внимательны: изменение длины метаданных требует осторожности, если в базе уже есть накопленные документы.

Шаг 2: Модификация процедуры ВводНового

Основная логика формирования номера при копировании документа должна быть прописана в предопределенной процедуре ВводНового(Копирование, ДокОснование). Мы будем использовать Копирование как маркер того, что создается подчиненный счет. Рассмотрим программный код:


Процедура ВводНового(Копирование, ДокОснование);
    Новый = 1;
    Если Копирование = 1 Тогда
        // Извлекаем номер главного документа для формирования префикса
        НомерГлавногоДокумента = ДокОснование.НомерДок;
        Слеш = Найти(НомерГлавногоДокумента, "/");
        Если Слеш > 0 Тогда
            НомерГлавногоДокумента = Сред(Лев(НомерГлавногоДокумента, Слеш - 1), 2);
            ДокументОснование = ДокОснование.ДокументОснование;
        Иначе
            ДокументОснование = ДокОснование;
        КонецЕсли;
        
        // Устанавливаем новый номер через слеш
        УстановитьНовыйНомер("0" + СокрЛП(НомерГлавногоДокумента) + "/");
        ЗаполнитьТЧПрикопировании(ДокументОснование);
        Возврат;
    КонецЕсли;
    // ... стандартная инициализация документа ...
КонецПроцедуры

Шаг 3: Автоматическое заполнение табличной части

Чтобы счета имели смысл, при создании подчиненного документа Счет необходимо понимать, сколько товара еще осталось доступным для отгрузки по главному счету. Для этого мы создадим процедуру ЗаполнитьТЧПрикопировании. Она будет анализировать уже выписанные счета и вычитать их количество из остатка основного документа.


Процедура ЗаполнитьТЧПрикопировании(ДокОснование)
    Перем Запрос, ТекстЗапроса;
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса = "
    |Период с (НачГода(ТекущаяДата)) по (КонГода(ТекущаяДата));
    |Товар = Документ.Счет.Товар;
    |Количество = Документ.Счет.Количество;
    |ДокументОснование = Документ.Счет.ДокументОснование;
    |Функция КоличествоСумма = Сумма(Количество);
    |Группировка Товар без групп;
    |Условие(ДокументОснование = ДокОснование);";

    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

    Табл = СоздатьОбъект("ТаблицаЗначений");
    ДокОснование.ВыгрузитьТабличнуюЧасть(Табл);
    
    // Цикл вычитания отгруженных позиций
    Пока Запрос.Группировка(1) = 1 Цикл
        НС = 0;
        Если Табл.НайтиЗначение(Запрос.Товар, НС, "Товар") > 0 Тогда
            НовоеКоличество = Табл.ПолучитьЗначение(НС, "Количество") - Запрос.КоличествоСумма;
            Если НовоеКоличество > 0 Тогда
                Табл.УстановитьЗначение(НС, "Количество", НовоеКоличество);
            Иначе
                Табл.УдалитьСтроку(НС);
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;

    ЗагрузитьТабличнуюЧасть(Табл);
    // Пересчет итоговых сумм для строк
    ВыбратьСтроки();
    Пока ПолучитьСтроку() = 1 Цикл
        Пересчет("Количество");
    КонецЦикла;
КонецПроцедуры

Альтернативные методы решения

Хотя предложенный программный метод отлично решает задачу «красивой» нумерации, проанализируем другие подходы, которые могут быть удобнее в зависимости от бизнес-процессов:

  1. Использование Договоров: Часто вместо модификации номеров проще создать отдельный договор для конкретной спецификации. Это упрощает отчетность в Бухгалтерском учете, так как все счета будут привязаны к одному объекту аналитики.
  2. Внешние печатные формы: Если изменение нумерации в базе вызывает опасения, можно оставить сквозную нумерацию для внутренних нужд 1С, а номер вида 0001/1 формировать только при печати документа. Это исключает риски сбоя автонумерации платформы.
  3. Использование префиксов: Если в вашей организации несколько точек продаж или филиалов, обязательно учитывайте префиксы в методе УстановитьНовыйНомер, чтобы избежать пересечения номеров при автоматической генерации.

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

← На главную