В процессе разработки на платформе 1С:Предприятие 7.7 часто возникают задачи по агрегации данных. Одной из самых частых является использование метода Свернуть у объекта ТаблицаЗначений. Рассмотрим, почему при попытке свернуть таблицу по строковой колонке мы можем получить неожиданный результат в виде пустой строки, и разберемся с особенностями получения времени документа.
Если после выполнения кода ТЗ.Свернуть("Колонка1", "Колонка2") вы обнаруживаете, что данные в колонке, по которой производилась группировка, «исчезли» или стали пустыми, это почти всегда указывает на логическую ошибку в процессе заполнения таблицы до момента свертки. Давайте проанализируем, как правильно подходить к этому процессу.
"" при добавлении новой строки."Данные" и "Данные " как разные значения. Всегда используйте СокрЛП() перед присвоением значения ячейке таблицы."Строка".Разберем пример корректного формирования и свертки таблицы:
// Создание таблицы и колонок
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Время", "Строка");
ТЗ.НоваяКолонка("Сумма", "Число");
// Заполнение данных
ТЗ.НоваяСтрока();
ТЗ.Время = "С 9 до 10";
ТЗ.Сумма = 100;
// Выполнение свертки
ТЗ.Свернуть("Время", "Сумма");
Частый вопрос новичков — почему попытка обратиться к Документ.ВремяДок возвращает некорректные данные. Важно понимать, что в 1С 7.7 ВремяДок не является обычным реквизитом, который можно считать простым обращением к объекту в большинстве конфигураций. Время документа хранится в системных полях, и для доступа к нему используется специальный метод ПолучитьВремя().
Чтобы корректно извлечь время из объекта документа, выполните следующие шаги:
Документ в памяти через СоздатьОбъект("Документ").НайтиДокумент(КонтекстДокумента).ПолучитьВремя(), передав в него переменные для часов, минут и секунд.Рассмотрим пример кода для получения времени:
Перем Часы, Минуты, Секунды;
Док = СоздатьОбъект("Документ");
Если Док.НайтиДокумент(ВыбранныйДокумент) = 1 Тогда
Док.ПолучитьВремя(Часы, Минуты, Секунды);
Сообщить("Время документа: " + Часы + ":" + Минуты + ":" + Секунды);
КонецЕсли;
Важное примечание: При свертке данных по времени не стоит использовать полное значение времени до секунды, так как вероятность попадания двух документов в одну секунду ничтожна мала. Для целей аналитики (например, формирования отчетов по часам) рекомендуется преобразовывать полученное время в строковый формат интервала, например: "С " + Часы + " до " + (Часы + 1). Это позволит эффективно сгруппировать ваши данные.
Всегда помните, что ПолучитьВремя() применим только к объектам, созданным методом СоздатьОбъект, и работает корректно с объектами, уже записанными в базе данных. Следование этим простым правилам поможет вам избежать типичных ошибок при работе с таблицами значений и документами.