1с не редактируется регистр сведений
В этой статье мы научимся программно работать с регистром сведений, используя объект Менеджер записи регистра сведений.
Создать менеджер регистра сведений достаточно просто, например:
Хочу заметить, что работать с менеджером регистра сведений можно или в толстом клиенте, или в серверном контексте. В тонком клиенте код, написанный в этой статье работать не будет!
Для того, чтобы программным способом создать, редактировать или удалить конкретную запись независимого регистра сведений, необходимо использовать объект РегистрСведенийМенеджерЗаписи. С помощью данного объекта можно получить доступ к записи с необходимым набором полей. Создается менеджер записи с помощью функции менеджера регистров СоздатьМенеджерЗаписи.
Переменная МенеджерЗаписи, которую мы создали, имеет тип РегистрСведенийМенеджерЗаписи, этот тип предназначен для чтения, редактирования и удаления конкретной записи. Мы можем обращаться к измерениям, ресурсам и реквизитам регистра сведений как к свойствам данного объекта. Заполним созданную запись.
Объект РегистрСведенийМенеджерЗаписи позволяет управлять записью регистра сведений и применим только для независимых регистров. Доступ к записи обеспечивается путем присвоения значений полям объекта, которые соответствуют измерениям, ресурсам и реквизитам регистра. В Вашем примере это измерения Период, ВидТоплива и Поставщик, а также ресурс Цена.
Переменные, которые присваиваются полям регистра в моем случае это реквизиты управляемой формы 1С.
Относительно периода замечу, что платформа самостоятельно изменит текущую дату на дату начала периода, который установлен в свойстве периодичность регистра сведений (если периодичность месяц, а в период передана дата 21.12.2017, то запишется 01.12.2017).
В данном примере я не выясняю, есть ли уже запись с заданным набором ключевых полей (измерений), а просто записываю ее, поэтому если такая запись уже есть, то она перезапишется.
Метод Прочитать считывает данные регистра по указанным измерениям и периоду, а метод Выбран возвращает Истину, если есть запись с указанными полями, и Ложь, если такой нет.
В этом случае наш код изменится.
В этом случае мы присваиваем значения ключевым полям (измерениям) и периоду. А после применяем метод Прочитать. Данный метод считывает записи с регистра по указанным ключевым полям (измерениям) и периоду. Если есть записи с данным набором полей, то метод Выбран возвращает Истину, иначе – Ложь. В Вашем примере, если метод Выбран вернул значение Ложь (записей нет), то мы присваиваем значения измерениям и ресурсу и записываем.
Если же нам нужно будет удалить запись с заданным набором измерений, то код немного поменяется.
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Если Вам помог этот урок решить какую-нибудь проблему, понравился или оказался полезен, то Вы можете поддержать мой проект, перечислив любую сумму:
можно оплатить вручную:
(3) А можно чуть подробнее ?
Вот так может ? Но это работает только для одной записи ? А как же пробежаться по всем ?
Перебрать записи можно так
НаборЗаписей = РегистрыСведений.МойРегистр.СоздатьНаборЗаписей();
НаборЗаписей.Прочитать();
Для Каждого Запись Из НаборЗаписей Цикл
Но надо пробовать, модификация измерений в регистре может не прокатить.
(8)
Не соглашусь. Все работает.
(13)
Не нужно каждый раз записывать набор. Достаточно один раз в конце.
План захвата терргиторий:
1. Создать набор записей
2. Установить отбор по Контрагенту1
3. Выгрузить в таблицу значений
4. Очистить набор записей
5. Записать набор записей
6. В таблице значений заменить значение в колонке контрагент на Контрагент2
7. Создать набор записей
8. Установить отбор по Контрагенту2
9. Загрузить таблицу значений
10. Записать набор записей
(10)
План захвата терргиторий:
1. Создать набор записей
2. Установить отбор по Контрагенту1
3. Выгрузить в таблицу значений
4. Очистить набор записей
5. Записать набор записей
6. В таблице значений заменить значение в колонке контрагент на Контрагент2
7. Создать набор записей
8. Установить отбор по Контрагенту2
9. Загрузить таблицу значений
10. Записать набор записей
Вот так без лишнего.
Добрый день, необходимо примерно то же .
Написала так:
Набор=РегистрыНакопления.НДСНачисленный.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(ДокументРеализации.Ссылка);
// регистратор беру из формы
Для Каждого СтрокаТЧ ИЗ Таблица Цикл
// здесь меняем все, что необходимо
КонецЦикла;
Набор.Загрузить(Таблица);
Набор.Записать(Истина);
Подскажите, пожалуйста, почему изначально выгружается пустая таблица (даже без отбора, я проверила).
Редактирование регистров вручную
В 1С:Предприятии 8 существует возможность организовать в форме редактирование пользователем записей любого регистра, в том числе, и для подчиненного регистратору. Данная возможность соответствует общему подходу, принятому в 1С:Предприятии 8 в отношении модификации записей регистров. Система допускает и программное, и интерактивное изменение записей регистра без какого-либо участия регистратора (документа). Для выполнения таких изменений достаточно указать только ссылку на регистратор, чтобы определить значение отбора записей регистра.
Следует заметить, что эта возможность никак не противоречит типовой стратегии формирования движений при проведении документов. Система допускает, наряду с основной стратегией, используемой в большинстве случаев и предполагающей формирование движений в процессе проведения, и другие варианты. Например, непосредственное изменение движений может использоваться для создания документов, предназначенных для ручного редактирования движений регистров. Такая возможность широко используется для регистров бухгалтерского учета, но может применяться и для других регистров. Это позволяет предоставить пользователю или администратору системы возможность отражения в регистре операций, для которых не предусмотрено в конфигурации специального документа. Такая возможность никак не нарушает общую модель использования регистра как централизованной системы учета, а позволяет решать в нем дополнительные, заранее не предусмотренные задачи. Другим вариантом использования ручного редактирования регистров может являться предоставление пользователю возможности вносить изменения в движения, сформированные документом (в форме документа или в отдельной форме). Разумеется, реализация такой возможности требует от разработчика конфигурации решения вопросов связанных с регулированием полномочий пользователя и возможностью повторного формирования движений документом после их ручной корректировки. Например, может отмечаться, что движения данного документа изменены вручную и не должны обновляться при проведении. Система предоставляет весь необходимый набор средств для поддержки таких решений (расширения табличного поля, предназначенные для редактирования наборов записей, возможность отключения активности записей, отключение автоматического удаления движений и т.д.) Соответственно, это решение может применяться разработчиком, если он считает необходимым наличие такой возможности в прикладном решении.
В качестве примера рассмотрим создание документа "РучнаяОперация" для изменения данных регистра "УчетНоменклатуры".
Прежде всего, следует запретить проведение документа "РучнаяОперация". Работа стандартного механизма проведения документов нам, в данном случае, будет не нужна, поскольку мы собираемся вручную изменять записи в регистре накопления.
Затем, несмотря на то, что документ "РучнаяОперация" не проводится, следует указать, что движения документа будут находиться в регистре накопления "УчетНоменклатуры". Это необходимо для того, чтобы в форме документа нам был доступен для редактирования набор записей регистра накопления, содержащий движения документа "РучнаяОперация". Данная ситуация как раз очень хорошо иллюстрирует тот факт, что изменение записей регистра может выполняться не только при проведении документа, но и другими способами.
После этого в форме документа "РучнаяОперация" следует расположить табличное поле с командной панелью. Тип значения этого табличного поля должен быть "РегистрНакопленияНаборЗаписей.УчетНоменклатуры". Затем следует указать, что источником данных для этого табличного поля будут являться движения документа "РучнаяОперация" по регистру "УчетНоменклатуры":
Все, по большому счету, ручная операция готова. Можно в режиме "1С:Предприятие" создать новый документ, и используя пиктограммы командной панели, связанной с табличным полем, вручную редактировать набор записей этого документа.
Обратите внимание, что при записи документа в качестве регистратора для редактируемого набора записей будет установлен сам этот документ (независимо от значения, введенного вручную), и для каждой записи из набора может быть указан различный период, не совпадающий с датой самого документа.
Также следует заметить, что при пометке документа на удаление движения не очищаются, поскольку мы не задействовали механизм проведения документа. В случае если необходима подобная функциональность, можно регулировать активность движений.
Таким образом, мы рассмотрели общий случай создания ручной операции. Однако логика конкретного прикладного решения может накладывать различные ограничения на создаваемую ручную операцию. Одним из самых распространенных ограничений является требование синхронизации даты движений с датой самого документа.
Самым простым способом такой синхронизации является принудительная установка нужной даты движений в модуле формы документа:
Если теперь в режиме "1С:Предприятие" перезаписать созданные ранее документы "РучнаяОперация", можно убедиться, что дата движений будет синхронизирована с датой документа.
Такой способ синхронизации является самым простым и не учитывает возможность программной записи документа "РучнаяОперация". В самом деле, при программном вызове метода Записать() у объекта документа, он будет записан без участия формы документа. Это значит, что событие "При записи" формы документа вызвано не будет, и наш код обработчика не отработает. Чтобы предусмотреть возможность синхронизации периода движений документа с датой документа и в случае программной записи объекта документ, следует использовать обработчик события Перед записью() объекта документ, а не формы документа.
Удалим обработчик события Перед записью() формы документа и рассмотрим, как выполняется синхронизация даты документа и движений в модуле объекта. Для этого следует создать обработчик события Перед записью() в модуле объекта документа "РучнаяОперация", содержащий следующий текст:
В этом случае обработчик будет содержать больше кода за счет дополнительных проверок, которые выполняются в результате того, что возможна как интерактивная, так и программная запись объекта.
Поясним содержание обработчика. Если записывается новый документ или были изменены его движения - следует обновить дату движений. В противном случае мы считываем запросом дату документа из базы данных и сравниваем ее с датой, установленной у записываемого объекта. Если даты разные – также следует обновить дату движений.
Перед установкой даты мы проверяем, был ли прочитан набор записей в свойстве "Движения" объекта и изменялся ли он. Если оба этих условия ложны – это значит, что набор записей в свойстве "Движения" объекта пуст, и это состояние не связано с его изменением. В этом случае, чтобы предотвратить ошибочное удаление записей в регистре (перезапись пустым набором записей), мы предварительно читаем движения из регистра в набор записей в свойстве "Движения". Затем, как и в предыдущем случае, устанавливаем нужную дату для всех записей этого набора. При выполнении записи объекта документ, этот набор будет записан в регистр накопления.
Аналогичным образом в процессе записи документа "РучнаяОперация" можно управлять не только периодом записей регистра накопления, но и значениями других полей регистра.
Например, таким же образом может быть создан документ "Операция", позволяющий вводить ручные операции в регистр бухгалтерии. При этом, вероятно, кроме управления периодом записей регистра, вам потребуется управлять значением поля "Активность" ("включать" и "выключать" проводки документа) и т.д.
В заключение следует сказать, что выбор обработчика, в котором будет размещен текст процедуры, зависит от логики работы создаваемого объекта. Если конфигурация не предусматривает программной записи объекта – можно выбрать обработчик модуля формы. Если предполагается и программная модификация объекта – следует выбирать обработчик модуля объекта.
Заметьте, что оба эти способа не исключают модификацию записей регистра через объект "Регистр<…>НаборЗаписей.<имя регистра>". Поэтому, если логика конфигурации подразумевает возможность программной модификации объекта набор записей, код обработки следует размещать в обработчике события набора записей. Все попытки изменить данные регистра будут сведены, в конечном счете, к записи именно набора записей.
Манипулирование записями регистров без использования регистратора
В 1С:Предприятии 8 все регистры, кроме регистров сведений, всегда связаны с регистраторами. Регистры сведений могут быть независимыми или также подчиненными регистратору. В этом разделе мы опишем работу с регистрами, подчиненными регистраторам.
В большинстве случаев записи регистров, подчиненных регистраторам, создаются при проведении документов. Это наиболее "естественный" способ создания записей. В этом случае в процессе проведения документа формируются записи регистра, и, тем самым, происходит отражение в учете события описываемого документом.
Однако в 1С:Предприятии 8 существует возможность изменять записи регистров без участия документа. При этом следует учитывать, что каждая запись регистра всегда подчинена одному и только одному регистратору (документу). Поэтому с точки зрения "времени жизни" записи всегда подчинены конкретным регистраторам. Однако, записи могут изменяться без участия самого документа. Главное, чтобы в них имелась ссылка на документ.
Для изменения записей регистров, подчиненных регистраторам, используются наборы записей. При этом всегда используется отбор по регистратору. То есть совокупность записей, подчиненных одному регистратору, является "гранулой" изменения регистра. Нельзя добавлять или удалять отдельные записи. Можно только считывать и записывать записи по регистратору.
При изменении записей регистра можно использовать набор записей, входящий в коллекцию движений документа (свойство Движения объекта ДокументОбъект). Однако это не обязательно. Для изменения записей регистра можно использовать и набор записей созданный с помощью менеджера регистра.
Таким образом, чтобы изменить записи регистра необходимо:
- создать набор записей;
- установить отбор по определенному регистратору;
- прочитать набор;
- изменить записи набора;
- записать набор.
Например, чтобы установить значение реквизита во всех записях регистра можно использовать следующий алгоритм.
//Выберем всех регистраторов регистра
Запрос = Новый Запрос;
Запрос.Текст ;
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
//Обойдем регистраторов
Пока Выборка.Следующий() Цикл
Сообщить("Изменение записей по регистратору: " + Выборка.Регистратор);
//Для каждого регистратора выполним изменение набора записей
НаборЗаписей = РегистрыНакопления.УчетНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Значение = Выборка.Регистратор;
НаборЗаписей.Прочитать();
Для каждого Запись Из НаборЗаписей Цикл
Запись.Реквизит1 = "Тест";
КонецЦикла;
НаборЗаписей.Записать();
КонецЦикла;
В приведенном примере выполнялось изменение записей. Для добавления записей, если их нет у регистратора, можно выполнять запись без считывания. Для удаления записей можно выполнять запись пустого набора без выполнения считывания.
Заметим, что для добавления большого количества записей по одному регистратору существует возможность записывать записи без замещения. Это регулируется параметром метода Записать(). Такая возможность позволяет добавлять записи, не помещая их всех одновременно в оперативную память.
В регистрах расчетов кроме отбора по регистратору для набора записей можно также установить отбор по другим значениям измерений (только по равенству). Это позволяет выполнить изменение части записей, подчиненных одному регистратору.
Читайте также: