открыть форму записи регистра сведений по ключу записи
Открытие управляемой формы 1С записи регистра сведений
Своё знакомство с управляемым приложением 1С как разработчик я начал достаточно давно, но некоторые примеры разработки управляемого приложения повергают меня в шок до сих пор. Один из таких примеров — программное открытие управляемой формы записи регистра сведений.
Рассмотрим пример программного открытия управляемой формы уже существующей записи регистра сведений.
Открытие управляемой формы 1С записи регистра сведений
Стояла достаточно простая задача — открыть запись регистра сведений 1С «Счета учета» по значениям измерений. Данная процедура вызывалась из таблицы значений, где хранились значения этих измерений.
Процедура в итоге выглядела следующим образом:
&НаКлиенте
Процедура СчетаУчетаНоменклатурыПередНачаломИзменения(Элемент, Отказ)
ПередаваемыеПараметры = Новый Структура; //формируем структуру полей измерений
ПередаваемыеПараметры.Вставить(«Номенклатура»,СтрокаТабличнойЧасти.Номенклатура);
ПередаваемыеПараметры.Вставить(«Организация»,СтрокаТабличнойЧасти.Организация);
ПередаваемыеПараметры.Вставить(«Склад»,СтрокаТабличнойЧасти.Склад);
ПередаваемыеПараметры.Вставить(«ТипСклада»,СтрокаТабличнойЧасти.ТипСклада);
ПараметрыМассив = Новый Массив;
ПараметрыМассив.Добавить(ПередаваемыеПараметры); // помещаем структуру в массив
КлючЗаписиРегистра = Новый(«РегистрСведенийКлючЗаписи.СчетаУчетаНоменклатуры», ПараметрыМассив); //с помощью массива со структурой создаем ключ записи
ОткрытьФормуМодально(«РегистрСведений.СчетаУчетаНоменклатуры.ФормаЗаписи», Новый Структура(«Ключ», КлючЗаписиРегистра)); // передаем в форму ключ записи и открываем её
Этот способ я подсмотрел в типовой конфигурации. Я не очень понимаю, зачем в итоге такая длинная цепочка, если кто-то видел более простой способ. Просьба, напишите, как, в комментариях, буду очень Вам благодарен. Спасибо!
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
Программная работа с регистром сведений в 1С 8.3
Программная запись в регистр сведений
Добавление записей в регистр сведений выполняется с помощью набора записей. Набор записей — это коллекция нескольких записей регистра сведений.
Для добавление новых записей в регистр сведений нужно:
Набор записей с установленным отбором можно назвать гранулой. Запись в регистр сведений выполняется гранулами.
Если при записи не устанавливать отбор, то будет перезаписан весь регистр сведений, все предыдущие записи будут удалены:
Можно установить отбор только по одному измерению и сразу добавить несколько записей:
То есть при записи выполняется добавление новых записей с замещением тех записей, которые удовлетворяют установленному отбору.
Но если в метод Записать набора записей передать параметр Ложь, то запись будет выполнена с добавлением новых записей:
В результате в регистр сведений будет добавлена новая запись, но при этом все предыдущие записи не были удалены.
Если попытаться добавить в регистр сведений записи, которые не совпадают с установленным отбором, то будет выброшено исключение «Запись не верна! Значение поля не соответствует установленному отбору»:
Запись в регистр сведений, подчиненный регистратору может выполняться только с отбором по регистратору. В обработке проведения отбор по регистратору устанавливается автоматически, но если запись выполнять в другом месте, то нужно сделать это вручную:
Отбор записей регистра сведений
Отбор позволяет не только установить гранулу при записи в регистр сведений, но и прочитать нужные записи регистра. Например, можно получить все записи по одному товару:
После установки отбора набора записей, мы прочитали данные из регистра методом Прочитать. Данный метод загрузил в переменную НаборЦен все записи, удовлетворяющие отбору. После этого их можно перебрать в цикле и через точку обращаться к полям записи регистра.
Удаление записей регистра сведений
Чтобы удалить запись из регистра сведений нужно создать набор записей, установить необходимый отбор и записать пустой набор записей:
Чтобы очистить весь регистр сведений можно записать пустой набор записей без отбора:
Если регистр сведений подчинен регистратору, то нужно устанавливать отбор по документу-регистратору:
Если нужно удалить записи с отбором по ресурсу, то можно запросом выбрать необходимые записи, в цикле установить по нужным измерениям отбор и записать пустой набор записей:
В данном примере мы удалили все записи, у которых цена больше или равна 500. Но можно было решить ее от обратного: выбрать все записи, у которых цена меньше 500, создать набор записей и загрузить в него результат запроса. Так как отбор не был установлен, то весь регистр будет перезаписан и в нем останутся только те записи, где цена меньше 500:
Изменение записей регистра сведений
Чтобы изменить существующие записи регистра сведений нужно сначала прочитать их через набор записей, потом перебрать в цикле, изменить и записать набор записей. Например, увеличим все цены по одному типу цен на 10%:
Можно в запросе выбрать все измерения и период (для периодического регистра) и также изменить через набор записей, установив необходимый отбор:
Если регистр сведений подчинен регистратору, то отбор нужно устанавливать по регистратору:
Менеджер записи регистра сведений
Менеджер записи регистра сведений используется при интерактивном редактировании записи регистра сведений. Когда мы открываем форму записи, то чтение выполняется именно через менеджер записи. Когда нажимаем на форме записи кнопку Записать, то запись выполняется через менеджер записи.
Менеджер записи доступен только для регистров сведений с режимом записи Независимый.
Ключ записи регистра сведений для открытия ее формы
Ключ записи регистра сведений для открытия ее формы
Для того, чтобы открыть существующую запись регистра сведений в управляемых формах необходимо:
Первый пример кода открытия записи регистра сведений
МассивКонструктораКлюча = Новый Массив;
МассивКонструктораКлюча.Добавить(Новый Структура(«ГрафикРаботы,Дата,НачалоИнтервала»,Расшифровка.ГрафикРаботы,НачалоДня(Расшифровка.Дата),Расшифровка.Дата));
КлючЗаписиРегистра = Новый («РегистрСведенийКлючЗаписи.ТабельРаботы», МассивКонструктораКлюча);
ОткрытьФорму(«РегистрСведений.ТабельРаботы.Форма.ФормаНазначенияПериода», Новый Структура(«Ключ», КлючЗаписиРегистра));
Второй вариант открытия — с использованием серверного вызова
КлючЗаписиРегистра = ПолучитьКлючЗаписи(Новый Структура(«ГрафикРаботы,Дата,НачалоИнтервала», Расшифровка.ГрафикРаботы,НачалоДня(Расшифровка.Дата),Расшифровка.Дата));
ОткрытьФорму(«РегистрСведений.ТабельРаботы.Форма.ФормаНазначенияПериода», Новый Структура(«Ключ», КлючЗаписиРегистра));
Особенности использования
В случае отсутствия записи, когда указаны не действительные измерения регистра, выйдет ошибка «Объект не найден»:
Запись = РегистрыСведений.ТабельРаботы.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(Запись,Структура);
Запись.Прочитать();
Если Запись.Выбран() = Ложь
Возврат Неопределено;
КонецЕсли;
Любые издержки на рекламную кампанию:
— больше, чем может позволить себе клиент;
— меньше, чем ожидали люди из творческого отдела;
— примерно такие, которых с ужасом опасались бухгалтеры.
1с получить запись регистра сведений по ключу
Совокупность полей записи, по которой контролируется уникальность записей в регистре.
В регистре не может быть двух записей с одинаковыми значениями полей, входящих в ключ записи.
Также используется для идентификации записей, например, чтобы спозиционироваться на строку в списке.
У справочников и документов есть ссылка — по ней очень удобно находить объект и выполнять с ним любые манипуляции.
У регистра сведений такого простого способа нет.
Но не стоит отчаиваться! Ведь у регистра сведений есть ключ записи. Это то же самое.
Приступим к практике.
Рассмотрим два случая.
В первом нам нужно удалить записи регистра сведений, которые выбраны в множественном выборе в форме списка записей регистра сведений.
Во втором нам нужно в выбранных записях в этой же форме изменить значение какого-нибудь ресурса, например, присвоить ресурсу «Архив» значение истина и реквизиту » ДатаАрхивирования » значение текущей даты.
Нам понадобится функция:
Функция обПрочитатьМенеджерЗаписиПоКлючуЗаписи (МЗ, КлючЗаписи )Экспорт
МД = Метаданные.НайтиПоТипу ( ТипЗнч (МЗ));
Для Каждого Эл Из МД.Измерения Цикл
МЗ[ Эл.Имя ] = КлючЗаписи [ Эл.Имя ];
//Можно попробовать ЗаполнитьЗначенияСвойств (МЗ, КлючЗаписи );
Ну а дальше просто.
Чтобы удалить все выбранные в форме записи, используем код:
Если Вопрос(«Вы хотите удалить записи в » + ЭтаФорма.ЭлементыФормы.Список.ВыделенныеСтроки.Количество () + » строках», РежимДиалогаВопрос.ДаНетОтмена ) <> КодВозвратаДиалога.Да Тогда
Для Каждого Эл Из ЭтаФорма.ЭлементыФормы.Список.ВыделенныеСтроки Цикл
обПрочитатьМенеджерЗаписиПоКлючуЗаписи (МЗ, Эл);
Чтобы проставить нужные реквизиты, используем код:
Для Каждого Эл Из ЭтаФорма.ЭлементыФормы.Список.ВыделенныеСтроки Цикл
обПрочитатьМенеджерЗаписиПоКлючуЗаписи (МЗ, Эл);
Данный код работает только для непериодических регистров, для периодических в ключ записи нужно добавлять поле «Период».
Конечно, можно сложить все отобранные ключи и построить по ним набор записей с хитрым отбором (вряд ли это получится, но попытаться можно), но это будет сложный способ решить простую задачу.
Для того, чтобы открыть существующую запись регистра сведений в управляемых формах необходимо:
Первый пример кода открытия записи регистра сведений
МассивКонструктораКлюча = Новый Массив;
МассивКонструктораКлюча.Добавить(Новый Структура(«ГрафикРаботы,Дата,НачалоИнтервала»,Расшифровка.ГрафикРаботы,НачалоДня(Расшифровка.Дата),Расшифровка.Дата));
КлючЗаписиРегистра = Новый («РегистрСведенийКлючЗаписи.ТабельРаботы», МассивКонструктораКлюча);
ОткрытьФорму(«РегистрСведений.ТабельРаботы.Форма.ФормаНазначенияПериода», Новый Структура(«Ключ», КлючЗаписиРегистра));
Второй вариант открытия — с использованием серверного вызова
КлючЗаписиРегистра = ПолучитьКлючЗаписи(Новый Структура(«ГрафикРаботы,Дата,НачалоИнтервала», Расшифровка.ГрафикРаботы,НачалоДня(Расшифровка.Дата),Расшифровка.Дата));
ОткрытьФорму(«РегистрСведений.ТабельРаботы.Форма.ФормаНазначенияПериода», Новый Структура(«Ключ», КлючЗаписиРегистра));
Особенности использования
В случае отсутствия записи, когда указаны не действительные измерения регистра, выйдет ошибка «Объект не найден»:
Запись = РегистрыСведений.ТабельРаботы.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(Запись,Структура);
Запись.Прочитать();
Если Запись.Выбран() = Ложь
Возврат Неопределено;
КонецЕсли;
Реклама — двигатель всеобщей дебилизации населения.
Открыть форму записи регистра сведений по ключу записи
Описание:
Например, если мы хотим хранить информацию о ценах конкурентов на продаваемые нами товары, то собранная информация о ценах разворачивается по товарам и конкурентам. А если мы хотим отслеживать динамику изменений цен, и будем заносить их периодически, то хранимая информация разворачивается также и во времени.
Для разворота этой информации во времени используется поле «Период» регистра. Оно не вносится в качестве измерения, а добавляется системой автоматически при создании периодического регистра.
Для периодических регистров сведений система поддерживает такие стандартные операции, как получение наиболее позднего или наиболее раннего значения по определенной комбинации измерений (например, получение последней введенной цены по конкретному товару и конкретному конкуренту), а также получения среза наиболее поздних или ранних значений. Например, могут быть получены все последние введенные цены по различным товарам и конкурентам.
Если регистр не периодический, то поле «Период» для него не создается. В приведенном примере регистр «ЦеныКонкурентов» может быть непериодическим, если мы не хотим хранить историю изменения цен, а хотим иметь только актуальные цены. Тогда функция регистра сможет ответить на вопрос «какая сейчас цена у такого-то конкурента на такой-то товар», но не сможет ответить на вопрос «какая была цена у такого-то конкурента на такой-то товар в начале года».
Из описанных принципов работы регистра сведений вытекает то, что в системе может быть только одна запись с определенным набором и периодом измерений.
Действительно, по одному товару по одному конкуренту может быть только одна цена. Если по какой-либо причине мы можем получить несколько цен и хотим занести эту информацию в базу данных, то нам нужно создать еще одно измерение для хранения того значения, по которому эти цены могут различаться. Например, можно завести измерение «ИсточникИнформации». Тогда можно будет вводить цены конкурентов в разрезе источников.
Уникальность записей по набору измерений принципиально отличает регистры сведений от регистров накоплений, которые позволяют вводить несколько записей с одинаковым значением измерений и периодом.
Строки регистра сведений, содержащие информацию о значениях ресурсов для определенных значений измерений и конкретного периода, называются записями. Записи в регистр сведений можно вносить двумя способами: вручную или документами.
Эти два варианта влияют на способ внесения информации, а не на основную логику работы регистра.
Документ, которым вносится запись в регистр сведений, называется регистратором.
Регистры, записываемые независимо, могут свободно редактироваться вручную или средствами встроенного языка. При этом если измерение такого регистра назначено как «ведущее» и значением измерения является ссылка на объект базы данных, то будет считаться, что запись регистра имеет смысл, только пока существует этот объект. Например, если назначить ведущим измерение «Конкурент», то считается, что запись имеет смысл только как информация по данному конкуренту. Соответственно, при удалении конкурента записи по нему будут удалены автоматически.




