Как реализовать автосортировку номенклатуры по наименованию в 1С 7.7?

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

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

Вариант 1: Физическая сортировка строк в табличной части документа

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

Шаг 1. Добавим вспомогательную функцию в Глобальный модуль, которая будет подготавливать строковое значение для корректной сортировки:


Функция ЗначениеДляСортировки(ТекЗнач) 
    // На входе - объект (номенклатура), на выходе - строка для сортировки 
    ТипТекЗнач = ТипЗначенияСтр(ТекЗнач); 
    Если ТипТекЗнач = "Справочник" Тогда 
        Возврат СокрЛП(ТекЗнач.Наименование); 
    ИначеЕсли ТипТекЗнач = "Документ" Тогда 
        Возврат СокрЛП(ТекЗнач.НомерДок); 
    Иначе 
        Возврат Строка(ТекЗнач); 
    КонецЕсли; 
КонецФункции

Шаг 2. Там же, в Глобальном модуле, создадим процедуру, которая выполняет перестановку строк в документе:


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

Шаг 3. Теперь нам нужно вызвать эту процедуру в модуле конкретного документа (например, Реализация). Рассмотрим, куда лучше вставить вызов. Если мы хотим, чтобы сортировка происходила в момент проведения, используем предопределенную процедуру ОбработкаПроведения:


Процедура ОбработкаПроведения()
    глСортироватьТЧДокумента(Контекст, "Номенклатура");
    // Далее следует стандартный код проведения...
КонецПроцедуры

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

Вариант 2: Сортировка только при выводе на печать

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

Разберем, как изменить код процедуры печати в модуле формы документа:


Процедура Печать()
    ТЗ = СоздатьОбъект("ТаблицаЗначений");
    ТЗ.НоваяКолонка("НомСтрокиДок", "Число");
    ТЗ.НоваяКолонка("КолонкаСортировки", "Строка");
    
    // Заполняем таблицу соответствия
    ВыбратьСтроки();
    Пока ПолучитьСтроку() = 1 Цикл
        ТЗ.НоваяСтрока();
        ТЗ.НомСтрокиДок = НомерСтроки;
        ТЗ.КолонкаСортировки = ЗначениеДляСортировки(Номенклатура);
    КонецЦикла;
    
    // Сортируем таблицу значений по алфавиту
    ТЗ.Сортировать("КолонкаСортировки");
    
    // Выводим строки в печатную форму в новом порядке
    ТЗ.ВыбратьСтроки();
    Пока ТЗ.ПолучитьСтроку() = 1 Цикл
        ПолучитьСтрокуПоНомеру(ТЗ.НомСтрокиДок);
        // Здесь вызывается секция печати строки:
        // Таб.ВывестиСекцию("Строка");
    КонецЦикла;
КонецПроцедуры

Этот метод гарантирует, что кладовщик получит удобно отсортированный список, а бухгалтерская база сохранит неизменность первичного ввода данных.

Расширение возможностей: Сортировка по адресу хранения

Выясним, как сделать работу склада еще эффективнее. Сортировка по наименованию (A-Z) удобна, но она не учитывает физическое расположение товара на стеллажах. Если в вашей конфигурации «Торговля и Склад» у номенклатуры заведен реквизит Ячейка или АдресХранения, мы можем модифицировать алгоритм.

Рассмотрим рекомендации по организации «пути обхода»:

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

Технические нюансы и производительность

При работе с большими документами (более 500 строк) стандартные методы 1С 7.7 могут работать медленно. Разберем несколько советов по оптимизации:

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

Очистка спецсимволов: В функции ЗначениеДляСортировки рекомендуется программно удалять лишние пробелы в начале наименования или кавычки. В 1С 7.7 символы имеют свои веса, и товар с названием "Яблоко" (в кавычках) окажется выше товара Апельсин, что нарушит алфавитный порядок.

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

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

← На главную