При ведении кадрового учета и заполнении документа Табель на крупных предприятиях возникает необходимость упорядочить большой список сотрудников строго по табельным номерам. Однако стандартное включение опции упорядочивания или попытка отсортировать строки вручную через интерфейс формы нередко приводит к неожиданным результатам: список группируется хаотично, по половому признаку, либо сортировка продолжает выполняться по алфавиту (ФИО).
Проанализируем ситуацию, выясним внутренние механизмы платформы «1С:Предприятие», вызывающие такое поведение, и разберем по шагам рабочие способы правильной настройки списка сотрудников.
Посмотрим на ключевые факторы, из-за которых сортировка по табельному номеру в документе может давать сбой:
Код справочника Сотрудники (табельный номер) имеет тип «Строка». Если в информационной базе номера имеют разную длину (например, не содержат ведущих нулей: 1, 2, 10, 100) или содержат литерные префиксы филиалов и организаций, платформа упорядочивает их посимвольно. В результате строка 100 окажется выше, чем 2, а сотрудники с префиксами сгруппируются отдельными блоками.Сотрудник.Код через команду «Еще» — «Изменить форму» и кликнуть по заголовку колонки не дает нужного результата. В табличной части документа реквизитом строки является ссылка на справочник Сотрудники. При интерактивной сортировке платформа 1С упорядочивает строки по основному представлению ссылочного объекта — то есть по ФИО сотрудника, игнорируя значение отображаемого вложенного реквизита.
ТаблицаДляСортировки.Колонки.Добавить("КлючСортировки");
ТаблицаДляСортировки.Колонки.Добавить("СотрудникПредставление");
КолонкаСотрудник = ТаблицаДляСортировки.ВыгрузитьКолонку("Сотрудник");
КолонкаНомерСтроки = ТаблицаДляСортировки.ВыгрузитьКолонку("НомерСтроки");
Изменение настроек упорядочивания в программе не перестраивает строки в уже заполненном документе автоматически: алгоритм применяется строго заново при полной перезаписи табличной части.
Разберем по шагам, как правильно активировать штатный механизм упорядочивания в программах 1С:ERP и 1С:ЗУП:
Если после выполнения первого способа часть сотрудников все еще отображается в начале или конце списка обособленными группами, необходимо проверить формат самих номеров:
0000-00001, 0000-00002, а не 1, 2).Если цель упорядочивания — получение корректной печатной формы или сверка данных табельного учета, наиболее надежным и гибким инструментом выступает специализированный отчет:
Сотрудник и добавим поле Сотрудник.Код (по возрастанию).Табель.Когда на предприятии учет требует ручной корректировки видов времени непосредственно в документе, перезаполнение по кнопке Заполнить приведет к потере внесенных часов. В такой ситуации для программиста оптимальным решением является добавление расширения с кнопкой сортировки табличной части на форме документа.
Рассмотрим пример алгоритма сортировки строк таблицы документа, приводящего строковый код к числу для исключения ошибок сортировки разной длины строк:
&НаКлиенте
Процедура ПересортироватьТабельПоТабельномуНомеру(Команда)
ПересортироватьТабельНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПересортироватьТабельНаСервере()
Таблица = Объект.ДанныеОВремени.Выгрузить();
Таблица.Колонки.Добавить("ЧисловойНомер", Новый ОписаниеТипов("Число"));
Для Каждого Стр Из Таблица Цикл
// Очищаем код от нечисловых символов и преобразуем к числу
СтрокаКода = Стр.Сотрудник.Код;
ТолькоЦифры = "";
Для Индекс = 1 По СтрДлина(СтрокаКода) Цикл
Символ = Сред(СтрокаКода, Индекс, 1);
Если СтрНайти("0123456789", Символ) > 0 Тогда
ТолькоЦифры = ТолькоЦифры + Символ;
КонецЕсли;
КонецЦикла;
Стр.ЧисловойНомер = Число(ТолькоЦифры);
КонецЦикла;
Таблица.Сортировать("ЧисловойНомер Возр");
Объект.ДанныеОВремени.Загрузить(Таблица);
КонецПроцедуры
Такой подход позволяет упорядочивать список более чем из 1000 сотрудников в один клик без потери ранее внесенных отметок времени и явок.