Отладка запросов с виртуальными таблицами

Вариант 1
В отладчике вычислить выражение:
Запрос.МенеджерВременныхТаблиц.Таблицы.Получить(0).ПолучитьДанные().Выгрузить()
Где 0 — индекс временной таблицы

Вариант 2
В отладчике вычислить выражение:
Запрос.МенеджерВременныхТаблиц.Таблицы["ИмяВременнойТаблицы"].ПолучитьДанные().Выгрузить()
Где ИмяВременнойТаблицы — имя таблицы в запросе

PS
Показать список всех временных таблиц:
Запрос.МенеджерВременныхТаблиц.Таблицы

Открыть форму нового объекта с заполнением

В управляемых формах появилась очевидная проблема: Как открыть форму с объектом который я программно заполнил, но не сохранил еще в базу?
ОТВЕТ: По умолчанию — никак.

Единственное что можно заставить сделать систему по умолчанию, при открытии формы, это выполнить стандартную функцию модуля объекта ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка), где ДанныеЗаполнения — это структура которую мы передали при открытии формы.

Сначала небольшой кусок кода чтобы не забыть что какие ключи надо передавать при открытии формы.

Данные = Новый Структура();
Данные.Вставить("Наименование", "ТЕСТ НАИМЕНОВАНИЯ");
Данные.Вставить("Комментарий", "ТЕСТ");
Данные.Вставить("Артикул", "ТЕСТ");
ПараметрыФормы = Новый Структура("ЗначенияЗаполнения", Данные);
ОткрытьФорму("Справочник.Номенклатура.ФормаОбъекта", ПараметрыФормы);

Собственно что здесь важно:

  • Данные — структура в которую мы пишем наименования полей открываемого объекта и их значения
  • ПараметрыФормы — тоже структура с ключом «ЗначенияЗаполнения» — это предопределенный ключ для параметров передаваемых в форму. Платформа при получении этого ключа выполнить стандартную функцию модуля объекта ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка), где ДанныеЗаполнения — это структура которую мы передали при открытии формы.

ПРИМЕЧАНИЕ:

В открывшейся форме все данные которые вы ей передадите будут так же лежать в переменной Параметры.ЗначенияЗаполнения в модуле формы объекта

У переменной Параметры, есть еще несколько предопределенных ключей

  • Ключ — сюда ложим ссылку если хотим открыть форму существующего объекта
  • ЗакрыватьПриВыборе — для форм списков, что написано то и делает, после двойного щелчка по строке списка закрывает форму выбора
  • ЗакрыватьПриЗакрытииВладельца — если форма А владелец формы Б, то при закрытии А, закроется и Б.
  • ЗначениеКопирования — ссылка на объект копию которого мы хотим открыть. копия будет не сохранена.
  • ЗначенияЗаполнения — Это мы отобразили в самом начале. Структура с данными заполнения
  • Основание — ссылка на объект основание
  • ПараметрыВыбора — Содержит значения, по которым проверяется возможность выбора для форм, находящихся в режиме выбора.
  • РежимВыбора — Если Истина, открывает форму в режиме выбора.

Передавать можно несколько параметров одновременно.

ДОПОЛНИТЕЛЬНЫЙ ХАК

Если по каким-то причинам, нет желания пихать логику заполнения в сам объект. Вот идея и немного кода для облегчения жизни:

В функцию ОбработкаЗаполнения все равно придется написать немного своего кода, хорошо то что он может быть универсальный и его можно запихать в расширение (очень полезно для стандартных конфигураций)

Порядок действий:

  1. Создадим объект (например так: ДокТМП = Документы.ЗаказКлиента.СоздатьДокумент();)
  2. ДокТМП — заполним так как считаем нужным (реквизиты и таб части)
  3. Отправим его в функцию ПолучитьДанныеОбъектаДляФормыНового(ОбъектДанных)
    Функция ПолучитьДанныеОбъектаДляФормыНового(ОбъектДанных)
    	СтруктураДанныхОбъекта = Новый Структура();
    	Для каждого Реквизит ИЗ Метаданные.Документы.ЗаказКлиента.Реквизиты Цикл
    		СтруктураДанныхОбъекта.Вставить(Реквизит.Имя, ОбъектДанных[Реквизит.Имя]);
    	КонецЦикла;
    	
    	ТблТМП = Новый ТаблицаЗначений;
    	ТблТМП.Колонки.Добавить("Имя");
    	ТблТМП.Колонки.Добавить("Адрес");
    	Для каждого ТабЧасть ИЗ Метаданные.Документы.ЗаказКлиента.ТабличныеЧасти Цикл
    		Если ОбъектДанных[ТабЧасть.Имя].Количество() = 0 Тогда 
    			Продолжить;
    		КонецЕсли;
    		
    		СтрТМП = ТблТМП.Добавить();
    		СтрТМП.Имя	 = ТабЧасть.Имя;
    		СтрТМП.Адрес = ПоместитьВоВременноеХранилище(ОбъектДанных[ТабЧасть.Имя].Выгрузить(),Новый УникальныйИдентификатор());
    	КонецЦикла;
    	
    	Если НЕ ТблТМП.Количество() = 0 Тогда 
    		СтруктураДанныхОбъекта.Вставить("АдресОписаниеТабЧастей", ПоместитьВоВременноеХранилище(ТблТМП,Новый УникальныйИдентификатор()));
    	КонецЕсли;
    	
    	Возврат СтруктураДанныхОбъекта;
    КонецФункции
    
  4. Полученную структуру передаем открываемую форму:
    	ПараметрыЗаполнения = Новый Структура("ЗначенияЗаполнения", СтруктураДанныхОбъекта);
    	ОткрытьФорму("Документ.ЗаказКлиента.ФормаОбъекта", ПараметрыЗаполнения, ЭтаФорма, ЭтаФорма.УникальныйИдентификатор);
    
  5. В открываемом объекте нужно обработать полученные данные:
    Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
      ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);
      Если ТипДанныхЗаполнения = Тип("Структура") Тогда
        ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеЗаполнения);
          Если ДанныеЗаполнения.Свойство("АдресОписаниеТабЧастей") Тогда
            ОписаниеТабЧастей = ПолучитьИзВременногоХранилища(ДанныеЗаполнения.АдресОписаниеТабЧастей);
            Для каждого ОписаниеТабЧасти Из ОписаниеТабЧастей Цикл
              ТблТМП = ПолучитьИзВременногоХранилища(ОписаниеТабЧасти.Адрес);
              ЭтотОбъект[ОписаниеТабЧасти.Имя].Загрузить(ТблТМП);
            КонецЦикла;
          КонецЕсли;
    
          СтандартнаяОбработка = Ложь;
        КонецЕсли;
    КонецПроцедуры
    

 

Работа со списком записей регистра (управляемые формы)

Осветим небольшой нюанс работы со списком записей регистра сведений.
Задача:
Пользователь выделил несколько строк в списке. По нажатию кнопки на основе записей нужно создать элементы справочника, а записи отметить как отработанные или удалить.
Решение раскладывается на несколько этапов:

  1. Обойти выделенные строки в цикле
  2. Получить по каждой выделенной строке запись
  3. Выполнить полезное действие на основе записи
  4. Изменить и записать обработанную запись регистра

Обойти выделенные строки в цикле

Для каждого КлючЗаписи ИЗ Элементы.Список.ВыделенныеСтроки Цикл
	ДанныеЗаписи = ПолучитьДанныеЗаписи(КлючЗаписи);
КонецЦикла;

КлючЗаписи — это Структура содержащая измерения регистра с данными измерений.
Получить все данные записи можно, например, таким образом

Запись = РегистрыСведений.КакойТоРегистр.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(Запись, ДанныеЗаписи);
Запись.Прочитать();
Если Запись.Выбран() Тогда
	//Прочитали запись - можем делать что то полезное
КонецЕсли;

 

Отборы в управляемых формах

1С становится все более многословной.
На этот раз досталось отбору в табличных частях. Ну а мы не будем уподобляться ей и сразу к делу:

ЭлементОтбора = [Список].Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных([ИмяКолонкиТаблицы]); 
ЭлементОтбора.ВидСравнения = [ВидСравненияКомпоновкиДанных.НеРавно];
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ПравоеЗначение = [Истина];
ЭлементОтбора.Представление = ["Зарегистрирован"];
ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;

В квадратных скобках указаны ваши данные

  • [Список] — здесь имя реквизита табличной части на управляемой форме
  • [ИмяКолонкиТаблицы] — колонка по которой будет производится отбор (например: «Зарегистрирован»)
  • [ВидСравненияКомпоновкиДанных.НеРавно] — вид сравнения, в нашем случае — НеРавно, в вашем — что угодно
  • [Истина] — Правое значение в отборе — может быть конкретным значением или списком значений в зависимости от вида сравнения
  • [«Зарегистрирован»] — Представление в отборе — ваше название для поля отбора

Отбор можно применять для любых списков:

  • Регистры
  • Справочники
  • Документы
  • и т.д.

Расчет АВС в СКД агрегатная функция

Начиная с версии 8.3 платформы 1С в СКД появилась агрегатная функция КлассификацияABC (ClassificationABC). Для конфигурации должен быть установлен режим совместимости не ниже 8.3.3.

Синтаксис:

КлассификацияABC(Значение, КоличествоГрупп, ПроцентыДляГрупп, ИмяГруппировки)

Параметры:

  • Значение – тип Строка.  по которому нужно рассчитывать классификацию. Строка, в которой указано выражение;
  • КоличествоГрупп — тип Число. Задает количество групп, на который нужно разбить;
  • ПроцентыДляГрупп — тип Строка. Столько, на сколько групп нужно разбить минус 1. Через запятую. Если не задано, то автоматически;
  • ИмяГруппировки– тип Строка. Имя группировки, в которой нужно вычислять группировку обработки. Если не указано, то вычисление происходит в текущей группировке. Если вычисление идет в таблице и параметр содержит пустую строку, или не указан, то значение вычисляется для группировки – строки. Компоновщик макета при генерации макета компоновки данных заменяет данное имя на имя группировки в результирующем макете. Если группировка не доступна, то функция будет заменена на значение NULL.

Результатом работы функции будет номер класса, начиная с 1, который соответствует классу A.

Пример: КлассификацияABC(«Сумма(ВаловаяПрибыль)», 3, «60, 90»)

  • Добавить в вычисляемые поля — поле Класс (назвать как угодно)
    ПоляДляАВСКлассификации
  • В ресурсах прописать руками функцию  КлассификацияABC(«Сумма(ВаловаяПрибыль)», 3,,»Номенклатура»)
    РесурсыДляАВСКлассификацииВ приведенном примере АВС классификация будет рассчитываться по группировке Номенклатура, если последний параметр функции не заполнять, то классификация будет рассчитываться для текущей группировки.

Регламентные и фоновые задания в файловом режиме (начиная с версии 8.3.4)

Начиная с версии платформы 1С предприятия 8.3.4 появился механизм фоновых и регламентных заданий работающих в файловом режиме скрыто от пользователя.
Раньше если в файловом режиме запускалось регламентное задание то оно блокировало работу пользователя под которым запустилось до того момента пока не будет закончено
Теперь регламентные задания запускаются в отдельном процессе, на работу пользователя не влияют и окон не выводят — в общем как будто выполняются на сервере.

Условия работы нового механизма:

  • Конфигурация должна иметь режим совместимости не меньше чем 8.3.4

    Выбор режима совместимости
    Выбор режима совместимости
  • Клиент 1С предприятия должен запускаться с ключом AllowExecuteScheduledJobs. Запускать можно указывая ключ в командной строке, но проще указать в настройках запуска базы. Например так:

    Запуск в режиме обработки регламентных заданий
    Запуск в режиме обработки регламентных заданий
  • Код который прямо или косвенно будет выполняться в регламентных заданиях должен быть написан как для сервера, т.е. те функции которые недоступны на сервере будут блокировать выполнение регламентных заданий. Например: Функция ОткрытьФорму() или ЗавершитьРаботуСистемы() вызовут ошибку компиляции при запуске регламентного задания о которой оно отпишется в стандартный журнал регистрации
    ОшибкаЖурналаРегистрации

Полезные приемы для управляемых форм

Привет всем, кто недавно взялся за управляемые формы 1С.

Хоть идея заложенная в управляемых формах и весьма интересна, однако после толстого клиента возникает несколько вопросов — решение которых весьма нетривиально.

Содержание:

Начнем с простого:


Как получить Макет внешнего отчета/обработки?

ОбъектТМП = РеквизитФормыВЗначение("Объект");
Макет = ОбъектТМП.ПолучитьМакет("МойМакет");


Как сохранить настройки формы отчета или обработки? 

То что раньше мы делали функциями (толстый клиент)

СохранитьЗначение("Имя", Значение);
Значение = ВосстановитьЗначение("Имя");

Теперь делается так (тонкий клиент/управляемые формы):

ХранилищеПользовательскихНастроекДинамическихСписков.Сохранить("ИмяПараметра", "ИмяНастройки", Значение);
Значение=ХранилищеПользовательскихНастроекДинамическихСписков.Загрузить("ИмяПараметра", "ИмяНастройки")

Здесь стоит пояснить пару нюансов:

  1. Пример приведен для конфигурации Управление торговли 11.х. В УТ 11.х есть несколько стандартных хранилищ. Стандартные хранилища не требуют дополнительного кода т.е. можно пользоваться «КАК ЕСТЬ». Нюанс в том что не все из этих хранилищ будут делать то что вам нужно 🙂 — просто подберите то которое будет работать:
    1. ХранилищеПользовательскихНастроекДинамическихСписков
    2. ХранилищеНастроекДанныхФорм
    3. ХранилищеОбщихНастроек
    4. ХранилищеПользовательскихНастроекОтчетов
    5. ХранилищеСистемныхНастроек
  2. В УТ 11 есть также стандартное хранилище ХранилищеВариантовОтчетов — для него в конфигурации уже написан спец обработчик который требует определенной структуры параметров. Если есть желание — можете разобраться с ними самостоятельно.
  3. Есть также объект ХранилищеНастроек — он предназначен для разработки собственных хранилищ. Здесь нюанс в том, что этот объект сам по себе ничего не делает он предоставляет несколько обработчиков (пустых) в которых надо написать код для сохранения переданных значений. Куда и как сохранять дело сугубо личное, каждого кто решил с этим связаться.


Произвольный отбор в управляемых формах.

Часто для различных спец обработок требуется иметь произвольный отбор на форме. В толстом клиенте мы пользовались объектом Отбор, программно его заполняли и радовались жизни. В управляемых формах и тонком клиенте у нас отобрали такую возможность, но дали другую, выглядит она устрашающе, однако весьма проста в использовании, а главное — писать кода нужно даже меньше.

Итак:

  1. Заводим реквизит формы типа КомпоновщикНастроекКомпоновкиДанных (или реквизит обработки, кому как нравится) — назовем его НовыйОтбор (для примера)
  2. Если развернуть крестиком НовыйОтбор, то внутри мы увидим свойство Настройки, а внутри Настройки увидим Отбор — хватаем отбор мышкой и тащим на форму — в результате увидим форму стандартного отбора как в старые добрые …
  3. Инициализация отбора — просто так заполнить отбор элементами не выйдет. Для этого нужно сделать два шага
    1. Создать макет схемы (пример) — для тех кто в курсе как делать схемы СКД поясню простой принцип (кто не в курсе — смотрим пример): Делаем элементарный запрос (в СКД схеме) вида
      ВЫБРАТЬ
        Номенклатура.Ссылка КАК Номенклатура,
        Номенклатура.Производитель КАК Производитель,
        Склады.Ссылка КАК Склад
      ИЗ
        Справочник.Номенклатура,
        Справочник.Склады
      

      По запросу, СКД определит поля доступные для отбора. Если мы хотим чтобы в отборе были уже какие-то поля добавлены автоматически — идем на закладку Настройки (в СКД) -> Отбор и добавляем там поля в левую часть (не забываем устанавливать значения по умолчанию). Если непонятно — смотрим пример.
      Схему добавляем в макеты обработки/отчета.

    2.  Выполнить код (на сервере — функция с модификатором &НаСервере):
        //Получим схему из обработки
        ОбъектТМП = РеквизитФормыВЗначение("Объект");
        СхемаКомпоновки = ОбъектТМП.ПолучитьМакет("МояСхемаКомпоновкиНастроек");//Ваша схема может называться как угодно
        
        //Берем настройки по умолчанию из схемы
        НастройкиКомпоновки = СхемаКомпоновки.НастройкиПоУмолчанию;
        
        //Инициализируем наш отбор
        Адрес = Новый УникальныйИдентификатор();
        URLСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновки, Адрес);
        ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(URLСхемы);
      
        НовыйОтбор.Инициализировать(ИсточникНастроек);
        НовыйОтбор.ЗагрузитьНастройки(НастройкиКомпоновки);
      

      Код можно запихать например в функцию ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

  4. Использование отбора — Все элементы отбора находятся здесь:
    НовыйОтбор.Настройки.Отбор.Элементы

    Это коллекция, поэтому обходим её стандартным образом

    Для каждого Элемент ИЗ НовыйОтбор.Настройки.Отбор.Элементы Цикл
      //Строка(Элемент.ЛевоеЗначение) - это то что стоит слева   в отборе (например Номенклатура или Склад.Наименование)
      //Элемент.ПравоеЗначение - это значение отбора (например   реальная группа номенклатуры или склад)
      //Элемент.Использование - Истина - если стоит галка на ст  роке отбора
      //Элемент.ВидСравнения - поле типа ВидСравнения (Например  ВидСравнения.Равно)
    КонецЦикла;

 

PS Статья написана для обычных программистов, чтобы облегчить их жизнь. У кого жизнь и так легкая — завидую.
Будут еще плюшки — допишу в статью.
Будут вопросы пишите в почту: info@agency-sd.ru (не гарантирую что отвечу — работы много, но шанс есть)