В процессе работы торгового предприятия часто возникает проблема: сотрудники склада тратят лишнее время на поиск товаров в накладной, если они расположены в случайном порядке. Заставить операторов вручную сортировать десятки строк в каждом документе практически невозможно. В этой статье мы разберем, как автоматизировать этот процесс программными средствами 1С 7.7, чтобы товары в печатных формах или самих документах всегда были выстроены по алфавиту (A-Z).
Этот метод подразумевает изменение порядка строк непосредственно в базе данных при записи или проведении документа. Проанализируем алгоритм: сначала мы выгружаем данные во временную таблицу, сортируем их там и загружаем обратно в документ. Для реализации этого решения нам потребуется внести изменения в Глобальный модуль и Модуль документа.
Шаг 1. Добавим вспомогательную функцию в Глобальный модуль, которая будет подготавливать строковое значение для корректной сортировки:
Функция ЗначениеДляСортировки(ТекЗнач)
// На входе - объект (номенклатура), на выходе - строка для сортировки
ТипТекЗнач = ТипЗначенияСтр(ТекЗнач);
Если ТипТекЗнач = "Справочник" Тогда
Возврат СокрЛП(ТекЗнач.Наименование);
ИначеЕсли ТипТекЗнач = "Документ" Тогда
Возврат СокрЛП(ТекЗнач.НомерДок);
Иначе
Возврат Строка(ТекЗнач);
КонецЕсли;
КонецФункции
Шаг 2. Там же, в Глобальном модуле, создадим процедуру, которая выполняет перестановку строк в документе:
Процедура глСортироватьТЧДокумента(Конт, ОднаКолонка) Экспорт
Перем ТЗ;
Если Конт.КоличествоСтрок > 1 Тогда
ТЗ = СоздатьОбъект("ТаблицаЗначений");
Конт.ВыгрузитьТабличнуюЧасть(ТЗ);
// Добавляем временную колонку для строкового представления объекта
ТЗ.ВставитьКолонку(,1,"Строка");
Для Счетчик = 1 По ТЗ.КоличествоСтрок Цикл
ТЗ.УстановитьЗначение(Счетчик, 1, ЗначениеДляСортировки(ТЗ.ПолучитьЗначение(Счетчик, ОднаКолонка)));
КонецЦикла;
ТЗ.Сортировать("1"); // Сортируем по нашей временной колонке
ТЗ.УдалитьКолонку(1); // Удаляем лишнее перед загрузкой
// Очищаем и заполняем табличную часть заново
Конт.УдалитьСтроки();
Конт.ЗагрузитьТабличнуюЧасть(ТЗ);
КонецЕсли;
КонецПроцедуры
Шаг 3. Теперь нам нужно вызвать эту процедуру в модуле конкретного документа (например, Реализация). Рассмотрим, куда лучше вставить вызов. Если мы хотим, чтобы сортировка происходила в момент проведения, используем предопределенную процедуру ОбработкаПроведения:
Процедура ОбработкаПроведения()
глСортироватьТЧДокумента(Контекст, "Номенклатура");
// Далее следует стандартный код проведения...
КонецПроцедуры
Важное предостережение: Физическое изменение порядка строк имеет свои минусы. Если оператор привык к своему порядку набора или если документ уже был распечатан ранее, после перепроведения номера строк изменятся. Это может вызвать путаницу при сверке с бумажным носителем.
Проанализируем более безопасный подход — когда в базе данных строки остаются в авторском порядке, а сортировка происходит только в момент формирования печатной формы (накладной или листа сборки). Это идеальное решение для складской логистики.
Разберем, как изменить код процедуры печати в модуле формы документа:
Процедура Печать()
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("НомСтрокиДок", "Число");
ТЗ.НоваяКолонка("КолонкаСортировки", "Строка");
// Заполняем таблицу соответствия
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
ТЗ.НоваяСтрока();
ТЗ.НомСтрокиДок = НомерСтроки;
ТЗ.КолонкаСортировки = ЗначениеДляСортировки(Номенклатура);
КонецЦикла;
// Сортируем таблицу значений по алфавиту
ТЗ.Сортировать("КолонкаСортировки");
// Выводим строки в печатную форму в новом порядке
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
ПолучитьСтрокуПоНомеру(ТЗ.НомСтрокиДок);
// Здесь вызывается секция печати строки:
// Таб.ВывестиСекцию("Строка");
КонецЦикла;
КонецПроцедуры
Этот метод гарантирует, что кладовщик получит удобно отсортированный список, а бухгалтерская база сохранит неизменность первичного ввода данных.
Выясним, как сделать работу склада еще эффективнее. Сортировка по наименованию (A-Z) удобна, но она не учитывает физическое расположение товара на стеллажах. Если в вашей конфигурации «Торговля и Склад» у номенклатуры заведен реквизит Ячейка или АдресХранения, мы можем модифицировать алгоритм.
Рассмотрим рекомендации по организации «пути обхода»:
При работе с большими документами (более 500 строк) стандартные методы 1С 7.7 могут работать медленно. Разберем несколько советов по оптимизации:
Использование Таблицы Значений: Всегда работайте через ВыгрузитьТабличнуюЧасть. Прямой перебор строк документа с удалением и добавлением в цикле — самый медленный путь, который может привести к зависанию программы.
Очистка спецсимволов: В функции ЗначениеДляСортировки рекомендуется программно удалять лишние пробелы в начале наименования или кавычки. В 1С 7.7 символы имеют свои веса, и товар с названием "Яблоко" (в кавычках) окажется выше товара Апельсин, что нарушит алфавитный порядок.
Внешние компоненты: Для тех, кто хочет реализовать «визуальную» сортировку в форме списка без изменения данных, можно рассмотреть использование компоненты FormEx. Она позволяет кликать на заголовок колонки в табличной части и мгновенно перестраивать отображение строк для пользователя.
Таким образом, мы рассмотрели два надежных способа автоматизации порядка строк в 1С 7.7. Выбор между физической сортировкой в документе и виртуальной сортировкой при печати зависит от бизнес-процессов вашей компании и требований к неизменности данных.