СКД. Объединение ячеек на примере "Справка инвентаризации расчетов с покупателями и поставщиками по форме ИНВ-17"

06.10.20

Разработка - СКД

Шпаргалка. Объединение ячеек в отчете на СКД с произвольным макетом.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
СКД. Объединение ячеек на примере "Справка инвентаризации расчетов с покупателями поставщиками по форме ИНВ-17":
.erf 15,43Kb
12 3 000 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

Всем доброго времени суток. 

Данная статья используется больше для себя как шпаргалка. 

Опишу вкратце задачу. Иногда возникает ситуация, когда пользователь хочет видеть отчеты с объединёнными ячейками как в Экселе (визуально представлено на главной картинке темы). Каждый раз приходилось что-то выдумывать. И данная задача решалась разными методами.

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

Все отчеты написаны на СКД. Дальше я делал обычный макет в СКД и основную форму у данного отчета. После чего я переопределял стандартную процедуру «ПриКомпоновкеРезультата» .

Все действия по созданию внешнего отчета (создать внешний отчет на СКД с использованием своего макета и основной формы) – стандартны. Не буду их описывать. 

В чем заключается мое универсальное решение. В процедуре «ПриКомпоновкеРезультата» после стандартного вывода отчета я начинаю работать с самим табличным документом (куда вывел результат). Определяю высоту таблицы. И в цикле прохожу сам табличный документ по определенным ячейкам. Что имеется в виду:

На примере: Мне надо одинаковых контрагентов объединить в одну ячейку и вывести на против детальных записей. Для этого я запоминаю начало области первого контрагента, и когда при чтении следующей области сменился контрагента, я делаю отсечку области, запоминаю ее и объединяю.

После чего снова запоминаю начало области и дальше в цикле иду до следующего контрагента.

Ниже код. + внешний отчет для примера.

 Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    ДокументРезультат.Очистить();
    ДокументРезультат.АвтоМасштаб = Истина;
    ДокументРезультат.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
    ДокументРезультат.Защита = Ложь;
    ДокументРезультат.ОтображатьЗаголовки = Истина;
    
    //+Стандартный вывод СКД отчета
    МакетСКД = ЭтотОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
	Настройки = ЭтотОбъект.КомпоновщикНастроек.ПолучитьНастройки();
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	
	//+ssn внесем свои коррективы в типовой вывод
	ТекДата = Настройки.ПараметрыДанных.Элементы[1].Значение;
	МакетСКД.Макеты.Макет1.Параметры.МесяцОтчета.Выражение = """" + НРег(СклонениеПредставленийОбъектов.ПросклонятьПредставление(Формат(ТекДата.Дата, "ДФ=ММММ"), 2,)) +"""";
	//-ssn внесем свои коррективы в типовой вывод

	МакетКомпоновки =  КомпоновщикМакета.Выполнить(МакетСКД,Настройки,ДанныеРасшифровки);
	ПроцессорКД = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКД.Инициализировать(МакетКомпоновки,,ДанныеРасшифровки, Истина);
	  
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	ПроцессорВывода.Вывести(ПроцессорКД);	
    //-Стандартный вывод СКД отчета
    
    //+Объеденим ячейки 
    ОбъединитьЯчейкиВТабличномДокументе(ДокументРезультат);    
    //-Объеденим ячейки
    
КонецПроцедуры
 
Процедура ОбъединитьЯчейкиВТабличномДокументе(ТабличныйДокумент) Экспорт
    
    СтарыйКонтрагент = "";
    НачалоОбласти = "";
    ЭтоПервыйВход = Истина;
    //представим нашу область объединения ввиде квадрата.
    //его параметры:
    //                верхний левый улог - строка R26 столбец С6
    //                правый нижний угол - строка R26 столбец С23
    //в итоге получилась область R26С6:R26С23
    
    //так вот для того, чтобы программно объединить ячейки - в моем случаи нужно узнать строки. А колонки всегда жестко завязаны.
    ОбластьЛевыйВерхнийУгол = 26;
    ОбластьПравыйНижнийУгол = 26;
    

    ВысотаТЧ = ТабличныйДокумент.ВысотаТаблицы;
    
    Для Сч = 26 По ВысотаТЧ Цикл
        ТекОбласть = "R" + Сч + "C6:R" + Сч + "C23";
        НайденнаяОбласть = ТабличныйДокумент.Область(ТекОбласть);
        
        Если ТекОбласть <> НачалоОбласти И НайденнаяОбласть.Текст <> СтарыйКонтрагент Тогда 
            Если НЕ ЭтоПервыйВход  Тогда 
                ГотоваяОбластьДляОбъединения = "R" + Строка(ОбластьЛевыйВерхнийУгол) + "C6:R" +  Строка(Сч-1) + "C23";
                
                ОбластьЛевыйВерхнийУгол = Сч;
                ОбластьПравыйНижнийУгол = Сч;
                
                Область = ТабличныйДокумент.Область(ГотоваяОбластьДляОбъединения);
                Область.Объединить();
            Иначе
                ЭтоПервыйВход = Ложь;
            КонецЕсли;

            НачалоОбласти = ТекОбласть;    
            СтарыйКонтрагент = НайденнаяОбласть.Текст;
        КонецЕсли;
    КонецЦикла; 
    
КонецПроцедуры

 

Данный внешний отчет тестировался на Бухгалтерия предприятия, редакция 3.0 (3.0.75.104).

 

Вступайте в нашу телеграмм-группу Инфостарт

СКД объединение ячеек соединить ячейки сгруппировать на

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С:Предприятие 8 Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

16500 руб.

02.09.2020    255340    1411    421    

1154

Инструментарий разработчика СКД Программист 1С 8.3 Бесплатно (free)

В этой статье представлен СКДБилдер — общий модуль-обёртка над объектной моделью СКД, который сокращает код в 3-4 раза и делает его читаемым.

29.01.2026    6340    330    shapa_pro    25    

69

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Статья написана по результатам проведенного внутреннего обучающего вебинара для разработчиков ГК «СофтБаланс». Если осилить 25 000 знаков - задача для вас непосильная, где-то на бескрайних просторах интернета видео есть (или будет). Но здесь информация точнее. Разберем, чем запрос для СКД принципиально отличается от обычного запроса и как модифицируется в зависимости от настроек. Изучим «базовый рецепт» написания запроса для СКД, сформируем чек-лист. Полезно будет всем – от стажеров до тех. лидов. Всем, кто не снимает галку «автозаполнение» и пишет запросы для отчетов в консоли запросов – читать (вдумчиво) обязательно.

29.10.2025    18675    ovetgana    112    

111

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Описан способ заполнения списка доступных значений для полей наборов данных и параметров в схеме компоновки данных для любых конфигураций (с использованием БСП или без).

01.07.2025    10846    krasnoshchekovpavel    5    

68

СКД Программист Стажер 1С:Предприятие 8 Россия Бесплатно (free)

Несколько способов управления формами выбора параметров и отборов СКД.

10.04.2025    10393    Neti    0    

41

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Хорошая отчетная форма - сродни искусству. Есть какое-то невероятное эстетическое удовольствие в том, чтобы разобраться в логике учета и анализируемых показателях, спроектировать архитектуру хранения данных так, чтобы оптимально собрать эти показатели вместе с аналитическими разрезами в запросе, а затем настроить отображение так, чтобы, глядя на результат, сразу было понятно, что это за отчет и какие задачи он призван решать. Система компоновки данных - это моя первая, главная и, наверное, единственная "рабочая" любовь. Ее я использую везде, где только можно и где нельзя тоже. Хочу поделиться с вами некоторыми практическими приемами в работе с отчетами на СКД, которые, надеюсь, будут полезны.

27.02.2025    16453    ovetgana    50    

93

СКД Программист 1С:Предприятие 8 Бесплатно (free)

СКД – инструмент, на базе которого в современных конфигурациях реализованы практически все отчеты. СКД используется в динамических списках, печатных формах и универсальных механизмах. Если построить простейший отчет может каждый разработчик, то с нюансами знакомы далеко не все. Расскажем о неочевидных на первый взгляд приемах, способных значительно повысить качество отчетов.

24.12.2024    14110    Akcium    17    

46

СКД Механизмы типовых конфигураций Запросы Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    10901    AlexeyPROSTO_1C    1    

32
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. wowik 896 11.03.20 15:36 Сейчас в теме
+1. Свой макет в СКД, программная работа с табличным документом ("Область.Объединить()" и т.д.). Много времени потрачено. Не проще все руками, без СКД нарисовать?
3. boobzx 46 12.03.20 07:08 Сейчас в теме
(1)
роще все руками, без СКД нарисовать?


Не проще. Данное решение раньше делал руками. Приходилось описывать расшифровку, анализировать область вывода на печать и разделять страницу, чтобы все влезло на лист. Поля при печати. Почему пошел этим путем (СКД) - много мелкой муторной работы СКД сама уже выполнила. Мне осталось только Объединить области. Да и потом. Стандартный (Типовой Код ) в процедуре "ПриКомпоновкеРезультата" уже заполняется копипастом. И он на каждом углу разобран. Так что, осталось только объединить области.

Лично для меня это пока оптимальное решение.
user953326; +1 Ответить
2. ixijixi 2148 11.03.20 20:04 Сейчас в теме
4. boobzx 46 12.03.20 07:14 Сейчас в теме
(2) Баян баяном. А в явном виде для быстрого поиска решения нет с 2013 года.
Данное решение видел. Оно и легло в основу моего решения. И да, тут тоже Постобработка ТабДока.
user953326; +1 Ответить
5. ixijixi 2148 12.03.20 09:15 Сейчас в теме
(4) Вот если бы это сделать настройкой компоновки, то цены бы не было.
katod1985; +1 Ответить
6. boobzx 46 12.03.20 09:29 Сейчас в теме
(5)Да. Согласен. Но не удалось. :(
7. ixijixi 2148 12.03.20 09:48 Сейчас в теме
(6) Пока еще никому не удалось))
8. echo77 1938 17.11.21 10:59 Сейчас в теме
(5) Нет цены этому человеку :-) https://youtu.be/dIv-i9ejn04
Но, конечно же, это костыль :-)
native-api; katod1985; SagittariusA; yuraskas; ixijixi; +5 Ответить
9. ixijixi 2148 17.11.21 11:06 Сейчас в теме
(8) Отличный вариант!
10. boobzx 46 17.11.21 15:44 Сейчас в теме
(8)Да. Хорошо решение.
11. UralKIT 3 01.12.21 05:54 Сейчас в теме
(8) только не работает когда группировок более одной, т.к. коряво работает нумерация строк внутри разных группировок
12. Alex50 28.02.25 10:14 Сейчас в теме
(8) видео не смог посмотреть, но судя по комментариям используется вариант с добавлением пользовательского поля и функцией НомерПоПорядкуВГруппировке(), так немного неудобно, нужно добавлять группировку, скрывать ее, сложно сделать объединение нескольких столбцов, я использую немного модифицированный вариант, принцип тот же, добавляется вычисляемое поле предыдущей записи, например:
ПредыдущийКонтрагент = ВычислитьВыражение("Контрагент", , , "Предыдущая", "Предыдущая")
и так же два условных оформления
В первом (где нет границы снизу) два условия через ИЛИ ПредыдущийКонтрагент <> Контрагент ИЛИ ПредыдущийКонтрагент не заполнен
Во втором (где нет границы снизу и сверху и Текст = "") ПредыдущийКонтрагент = Контрагент

Так можно сделать для неограниченного количества столбиков и работает вне зависимости от группировки
13. Bas_ERP_UX 07.05.25 09:27 Сейчас в теме
Маленькое дополнение:
в строке
ТекОбласть = "R" + Сч + "C6:R" + Сч + "C23";

при Сч>=1000 получим ошибку "Область не найдена: R1 000C23:R1 000C23". Дело в представлении числа в 1С.

Вариант решения:
ТекОбласть = "R" + Формат(Сч, "ЧГ=0") + "C6:R" + Формат(Сч, "ЧГ=0") + "C23";
так же в строке
ГотоваяОбластьДляОбъединения = "R" + Формат(ОбластьЛевыйВерхнийУгол, "ЧГ=0") + "C6:R" + Формат(Сч-1, "ЧГ=0") + "C23";
функция Строка(ОбластьЛевыйВерхнийУгол) - не исправляет описанную ошибку.
14. Bas_ERP_UX 07.05.25 14:29 Сейчас в теме
Найдена особенность используемого алгоритма - для последнего контрагента объединения не происходит. Дело в том, что алгоритм объединяет предыдущие ячейки, находясь на следующей отличной от предыдущей. А так как мы перебираем все строки выведенного отчета - в конце мы находимся на последней строке и если она не отлична от предыдущей то на следующую строку мы не перейдем - цикл обхода закончится.

Самый простой вариант добавить 1:
Для Сч = 26 По ВысотаТЧ + 1 Цикл

Есть еще два варианта
1) Если ТекОбласть <> НачалоОбласти И НайденнаяОбласть.Текст <> СтараяСсылка ИЛИ Сч = ВысотаТЧ Тогда
Если Сч = ВысотаТЧ Тогда
Сч = Сч + 1;
КонецЕсли;

2)повторить код после цикла обхода всех записей
ГотоваяОбластьДляОбъединения = "R" + Строка(ОбластьЛевыйВерхнийУгол) + "C6:R" + Строка(Сч-1) + "C23";

ОбластьЛевыйВерхнийУгол = Сч;
ОбластьПравыйНижнийУгол = Сч;

Область = ТабличныйДокумент.Область(ГотоваяОбластьДляОбъединения);
Область.Объединить();
Для отправки сообщения требуется регистрация/авторизация