1с фиксациясверху не работает
Тема не нова - похожие решения были и на 8.0. К написанию статьи меня подтолкнул коллега, т.к. я это чудом не считаю. Несколько раз я видел тонны сложнейшего, и посему нерабочего кода, целью которого было сделать нечто похожее средствами, которые для этого не предназначены. В статье дан простейший пример, показывающий, как можно применять средства СКД для редактирования сложной структуры данных, например, табличных частей документов. В частности, рассмотрена работа с набором данных типа "Объект" и событием "Обработка расшифровки"
Описание проблемы и предпосылки
Периодически приходится решать задачи удобного ввода информации пользователем по образу Excel, например, самый простой "План продаж" по месяцам, в котором горизонтально по колонкам расположены месяцы, а вертикально - некая аналитика. Раньше в типовых конфигурациях 1С данная задача не была решена вообще никак. Пользователю предлагалось заполнить обычную табличную часть вручную, добавляя строки и заполняя их датами и необходимой аналитикой. Весь ужас такого ввода объяснять не нужно. Потом разработчики отраслевых решений в "доэскадэшную" эпоху догадались использовать всю мощь макета табличного документа и в "Подрядчик строительства" от "Импульс ИВЦ" уже можно было наблюдать весьма недурное решение в блоке Бюджетирование. Но код был неуниверсальный, сложный и крайне тяжело переносился на другие похожие задачи. В данной статье я постараюсь показать, как решить эту задачу быстро, красиво и с минимальными затратами по времени. Также код, который вы напишете, используя этот пример, вы сможете легко переносить на другие свои решения.
Реализация задачи
Описана для обычных форм, но обработка содержит и УФ без использования модальности.
Нам понадобится: сам объект редактирования (в данном случае табличная часть), макет СКД, компоновщик настроек компоновки данных, элемент управления "поле табличного документа", обработчик "Обработка расшифровки".
Макет СКД представляет собой соединение двух наборов данных, каждый из которых имеет тип "Набор данных - объект":
Настройки вывода просты и примитивны - это обычная таблица с итогами:
В форме необходимо разместить следующие реквизиты:
В обработчике расшифровки должен быть размещен отказ от стандартной обработки, а также описание набора действий, которые необходимо совершить, когда пользователь кликает по ячейке двойным кликом.
Данный код позволяет определить по какой именно ячейке кликнул пользователь. Далее, зная значение Номенклатуры и Периода можно найти соответствующую строку в табличной части и присвоить в ней реквизиту "Сумма" нужное значение, после можно программно нажать на кнопку "Обновить".
Производительность
Существует 2 способа непосредственного ввода значения при двойном клике по ячейки:
1) Через диалоговое окно методами ВвестиЗначение() или ВвестиЧисло()
- этот способ применен в данном примере.
Преимущества: не усложняет код, высокая производительность.
Недостатки: вылетает дополнительное окно ввода.
При таком способе ввода в каждой ячейке, как и при формировании обычного отчета на СКД, содержится лишь некий объект типа "ИдентификаторРасшифровкиКомпоновкиДанных", который по сути представляет собой число.
2) Непосредственно в ячейку, как в Excel.
Данный способ с применением СКД можно увидеть в ERP 2.0.
Преимущества: очень красиво, у неискушенных вызывает мгновенный вау-эффект, окон не вылетает.
Недостатки: низкая производительность, усложняет код. Нужно понимать, что при таком способе ввода в каждую ячейку придется помещать элемент управления "Поле ввода". Ячеек в поле табличного документа может быть несколько тысяч, т.е. несколько тысяч полей ввода. Вывод этого всего в поле табличного документа не будет быстрым даже в толстом клиенте.
Особенности работы в тонком клиенте без использования режима модальности.
Для работы в тонком клиенте необходимо помещать схему СКД и Данные расшифровки во временное хранилище. Хранить полученные адреса удобно в реквизитах формы.
Записываем адреса хранилищ в обработчике ПриСозданииНаСервере()
Обработчики событий Поля табличного документа и асинхронные вызовы
Обратите внимание, что во все конструкторы объектов СКД передаются сохраненные адреса АдресДанныеРасшифровки, АдреcМакетСКД. И почти все процедуры работают на клиенте. Но к сожалению не только лишь все могут работать на клиенте на клиенте реализованы не все объекты СКД. Иногда придется нырнуть на сервер, например для работы с объектом типа ДанныеРасшифровкиКомпоновкиДанных.
Обработчик ПолеТабличногоДокументаПредставлениеПриАктивизацииОбласти необходим для того, чтобы редактировать число(показатель) можно было непосредственно в ячейке, без использования дополнительных диалоговых окон.
Что еще?
UPD 07.07.2021 Добавлена реализация для тонкого клиента на управляемой форме без использования модальности.
1) Никто не запрещает размещать на форме стандартные настройки компоновщика настроек.
2) Можно добавлять в схему СКД любую другую информацию (с помощью других наборов данных), которая не содержится в табличной части редактируемого объекта, но которая необходима для принятия решения при вводе данных (например свойства номенклатуры).
3) Группировка данных в таблице также может быть сколь угодно сложной, в зависимости от решаемой задачи.
4) Можно и нужно использовать всю мощь СКД и возможностей условного оформления.
Здравствуйте!
Делаю отчет на СКД. Составляю собственный макет оформления. Необходимо зафиксировать заголовки таблицы.
Как это можно сделать? Настройки не нашёл. Подскажите пожалуйста. Может программно можно?
(1) nodalt, как вариант можно подменить "автоматическое" формирование отчета на "ручное", получить таблицы и уже обрабатывать ее как надо (менять колонки, фиксировать и т.д). Для этого можно использовать предопределенную процедуру ПриКомпоновкеРезультата модуля отчета.
Например (я так делал, но может есть и лучше способ):
Пробовал программно, но не работает этот код:
Может быть из-за того, что макет вручную рисовал.
(2) nodalt, ЭлементыФормы.Результат.ФиксацияСверху = ЧислоСтрокФиксации;
У меня повешено на кнопку "Зафиксировать шапку" на форме. Работает.
(2) nodalt, и зачем это делать при компоновке результата?
Можно последней строкой в: Процедура ДействияФормыСформировать(Кнопка)
ЭлементыФормы.Результат.ФиксацияСверху = ЧислоСтрокФиксации;
можно в этом макете спозиционироваться на первую ячеку нужной строки и нажать
таблица->вид->зафиксировать таблицу
чтобы снять фиксацию еще раз нажать эту кнопку
(10) nodalt, очень странно. Я привел код с работающей обработки и там проблем с фиксацией нет - все как часы работает. Обработка на "управляемой форме".
Может быть ты передаешь результат куда-то дальше и уже там фиксация слетает? проверь точнокй останова на конце процедуры - есть фиксация или нет. Или добавь последней строкой показ табличного документа. ДокументРезультат.Показать() - если только она на сервер не руганется
(13) Ягг, у меня форма обычная. Сам удивляюсь. Пробовал и в модуле код писать при компоновке результата и в модуле формы при открытии. Свойства поля "Результат" при отладке показывают фиксацию, но всё равно строки при скролинге предательски исчезают. Думаю всё дело в ручной прорисовке макета. С другой стороны - какая разница .
(14) nodalt, если форма обычная тогда попрбуй в конце ДокументРезультат.Показать() - посмотри будет фиксация или нет
(14) nodalt, Сделал специально новый отчет (на обычной форме) и у меня даже так работает
Странно, у меня вот тоже никак не получалось зафиксировать строки при полностью автоматическом выводе отчета.
"Полностью автоматическом" - имею в виду, когда вообще нет никакой процедуры-обработчика на кнопку "Сформировать". Просто стандартное ее поведение - формирование отчета на основе схемы компоновки.
Даже если пишу в событии "ПриКомпоновкеРезультата"
работают.
А вот фиксация - нет :)
Ягг, вывод отчета полностью автоматический?
Если есть возможность, выложите, пожалуйста, кто-нибудь, у кого работает, простенький отчетик с фиксацией строк.
Если не трудно :)
(18) 1cUserAndrew, вот пример - просто выводит справочник контрагентов и фиксируем 3 первые строки отчета (фиксация в модуле отчета). Все стандартное (кроме фиксации конечно). Отчет на обычной форме (но и на управляемой работает - проверил). Проверял на релизе (8.2.13.205) - конфигурация "Зарплата и кадры" (не суть важно, так как справочник "Контрагенты" есть везде)
В модуле отчета единственная процедура, а так все стандартное от СКД (никаких дополнительных форм)
PS. В целом Макет стандартный, но для проверки (тут не выложил) создал для группировки свой собсвенную область (на закладке "макеты") - фиксация осталась.
Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш 1С 8.x : Как убрать лидирующие нули в номере Документа (вариант2) 0
Скопировать строку с номером, с лидирующими нулями, в числовом поле (с форматом без групп, без группировки), и вернуть(скопировать) обратно в строковом поле с номером. Возвращает без нулей. Google maps : вывод точек на карту и режим панорамы 7
В отличие от яндекс карт в GMaps можно использовать панорамы - за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают! Для клиента нужно было сделать вывод объектов на карту С возможностью просмотра панора Посмотреть все результаты поиска похожих
Еще в этой же категории
Вывод картинки (изображения) на печать, в макет (табличный документ) 32
// 1-й вариант //Как вывести картинку в табличный документ? ТабДок = Новый ТабличныйДокумент; Макет = ОбработкаОбъект.ПолучитьМакет(" Макет" ); ОбластьКартинки = Макет.ПолучитьОбласть(" ОбластьСКартинкой" ); Картинка = Новый Картинка(ПутьККа Вывести табличный документ в PDF 18
Данный пример работает на платформе выше 8.2.13 Макет = ПолучитьМакет(" Макет" ); ОбластьШапка = Макет.ПолучитьОбласть(" Шапка" ); ТабДок = Новый ТабличныйДокумент; ОбластьШапка.Параметры.НомерДок = Номер; ОбластьШапка.Параметры.ДатаДок = Как программно изменить текст, цвет, фон ячейки или области табличного документа? 7
Ниже приведено несколько полезных шаблонов кода по работе с табличным документом: //Пример получения текста ячейки ПолеТабДок = ЭлементыФормы.тдПолеТабличногоДокумента; ПолеТабДок.Область("R1C2").Текст = спрНоменклатура.Наименование; ПолеТабДок Как в отобразить картинку в табличной части 7
В табличной части есть документы заявки от покупателя, нам нужно добавить картинку для отображения статуса документов заявка - проведен , не проведен, помечен на удаление. //Отобразим картинку Процедура СписокПриВыводеСтроки(Элемент, Оформление Вывод колонтитулов программно ВерхнийКолонтитул, НижнийКолонтитул 6
Колонтитул является специальным текстом, выводимым вверху или внизу каждой страницы при выводе документа на печать. В тексте колонтитула можно использовать следующие управляющие конструкции: > ( >) - при печати в данном месте будет выведен номер ст Посмотреть все в категории Табличный документ
also Что-то вроде FAQ Отзывов (7) В закладки
Для того, чтобы зафиксировать шапку в скд, необходимо обрабатывать табличный документ. В инструментах скд этот механизм отсутствует.
Код вывода с фиксацией шапки:
Для того, чтобы зафиксировать колонку по горизонтали, можно просто выполнить следующее:
UPD В 1с 8.2 в отчете у модуля объекта появился метод ПриКомпоновкеРезультата(), у которого есть параметр ДокументРезультат – табдок, который генерирует СКД.
По сути в модуле объекта можно прописать следующее:
Если программировать на 8.2, то можно реализовать проще.
В 1с 8.2 в отчете у модуля объекта появился метод ПриКомпоновкеРезультата(), у которого есть параметр ДокументРезультат – табдок, который генерирует СКД.
По сути в модуле объекта можно прописать следующее:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
ДокументРезультат.ФиксацияСверху = 8;
КонецПроцедуры
Спасибо! Добавлю в публикацию
Фиксацию в 8.1 также можно добавить через процедуру ОбновлениеОтображения(), правда смотрел только на небольших отчетах.
Мир Вам! У меня не получилось сделать вашим кодом, а получилось вот таким:
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(ОтчетОбъект.СхемаКомпоновкиДанных, ОтчетОбъект.КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
//Определение Процессора компоновки
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
//Определение Процессора вывода
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ЭлементыФормы.Результат);
//Получение доп макета для шапки и подвала
Макет = ОтчетОбъект.ПолучитьМакет(“Макет”);
//Вывод шапки
Область = Макет.ПолучитьОбласть(“Заголовок”);
//Область.Параметры.ДатаОтчета = Формат(ТекущаяДата(), “ДФ=dd.MM.yyyy”);
//Область.Параметры.Организация = организация;
//Область.Параметры.Месяц = Формат(Период, “ДФ=’MMММ yyyy'”);
ЭлементыФормы.Результат.Вывести(Область);
//Вывод таблицы
ПроцессорВывода.Вывести(процессорКомпоновки);
Вообще-то в 8.1 тоже можно поступить гораздо проще. В модуле формы отчета прописать процедуру
Процедура ОбновлениеОтображения()
ЭлементыФормы.Результат.ФиксацияСверху=1;
КонецПроцедуры
Только не могу понять что попадает сюда: ЭлементРезультата.ЗначенияПараметров
Не работает (по крайней мере на 8.1).
Не определён объект ПроцессорКомпоновкиДанных.
Для того чтобы заработало надо вверху добавить следующее:
—————————————————————————————————————
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(
СхемаКомпоновкиДанных,
КомпоновщикНастроек.Настройки );
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать( МакетКомпоновки );
—————————————————————————————————————
И не понятно зачем в “Результат.ФиксацияСверху = Результат.ВысотаТаблицы – 1;” минус один, должно быть без него.
Появилось несколько задач сделать внешние отчеты без ограничения прав, обычные формы, клиент- сервер, УПП 1.3.
Дано: пользователь с ролями "Пользователь ", "Вывод информации", надо сделать для него отчет, например, по Основным средствам.
1. Роли добавить пользователю нельзя;
2. УстановитьПривилегированныйРежим(Истина) - во внешних отчетах на обычных формах не работает;
3. Сделать отчет на управляемых формах и встроить отчет в конфигурацию - заказчик против, т.к. у него уже настроен доступ ко внешним отчетам и обработкам через RLS.
в остается формирование отчета в привилегированном модуле.
1. В конфигурацию добавляем общий модуль ДоработкиПривилегированный с галками Сервер, Вызов сервера, Привилегированный, в который помещаем функцию формирования отчета, см.код ниже.
2. В отчете, как обычно, в основной схеме компоновки добавляем набор данных - Запрос, делаем настройки. При запуске отчета создается программно еще одна схема - но с набором данных - Объект. Копируются все поля, параметры и ресурсы. Эта схема используется в отчете для инициализации компоновщика настроек и пользователь может настроить структуру без красных крестиков на полях.
Настройки, которые установил пользователь передаются на сервер, загружаются в настройки компоновщика основной схемы
Отчет по основной схеме формируется на сервере в общем модуле ДоработкиПривилегированный, возвращается назад уже готовый результат - Табличный документ.
Очень важно. В основной схеме компоновки данных в наборах данных обязательно должны быть указаны типы значений полей.
Функция СформироватьОтчет из модуля отчета:
Функция из модуля отчета, которая создает схему с набором данных Объект:
В процедуре ПрименитьНастройку модуля отчета:
В модуле отчета основную схему компоновки данных подменяем на созданную нами схему:
Функция в общем модуле ДоработкиПривилегированный (почти копия ТиповыеОтчеты.УниверсальныйМеханизмФормированияОтчета)
В архиве внешний отчет и текст для общего модуля. Тестировался на Управление производственным предприятием, редакция 1.3 (1.3.82.1). Не проверяла на сложных схемах с произвольными макетами, вложенными схемами.
Читайте также: