1с изменить запись в регистре бухгалтерии программно
Разберем один из объектов, при помощи которого можно записывать данные в регистр сведений 1С. Набор записей регистра сведений. Если при помощи менеджера записей регистра сведений мы могли работать в регистре только с одной записью, то при помощи набора можно создавать (удалять, редактировать) любое количество записей.
Для создания набора записи регистра сведений необходимо использовать метод СоздатьНаборЗаписей менеджера регистра сведений.
МенеджерЦеныНаТопливо = РегистрыСведений . ЦеныНаТопливо ;
НаборЗаписей = МенеджерЦеныНаТопливо . СоздатьНаборЗаписей ();
После выполнения данного метода будет создан набор записей регистра сведений, т.е. переменная НаборЗаписей кода выше имеет тип РегистрСведенийНаборЗаписей.ЦеныНаТопливо. Причем он будет создан абсолютно пустым!
Заметьте, набор записей можно создать или в серверном контексте, или в клиентском контексте, но в режиме толстого клиента. Под тонким клиентом, код приведенный в этой статье работать не будет!
Вы можете работать с этим набором записей как с коллекцией: добавлять, удалять запись, очищать всю коллекцию. Причем, метод СоздатьНаборЗаписей создает пустой набор записей. В нашей переменной НаборЗаписей нет ни каких данных, даже если они имеются сейчас в регистре. И если мы запишем этот набор, то все данные, которые есть у нас в регистре будет уничтожены. Т.е. код ниже приведет к полной очистке моего регистра сведений.
МенеджерЦеныНаТопливо = РегистрыСведений . ЦеныНаТопливо ;
НаборЗаписей = МенеджерЦеныНаТопливо . СоздатьНаборЗаписей ();
Записать() – это метод объекта набор записей регистра сведений, которые записывает данные из созданного набора непосредственно в регистр сведений. Причем данный метод имеет параметр Замещать типа Булево, который по умолчанию всегда равен Истине. Если данный параметр принимает значение Истина, то после записи набор записей из созданного объекта заместит данные в регистре сведений. Поскольку мы не создали ни какие данные (наш набор пуст), то у нас просто все текущие записи в регистре сведений удалятся. Если мы не хотим этого, то нужно просто в параметр Замещать передать Ложь.
МенеджерЦеныНаТопливо = РегистрыСведений . ЦеныНаТопливо ;
НаборЗаписей = МенеджерЦеныНаТопливо . СоздатьНаборЗаписей ();
НаборЗаписей . Записать (Ложь);
В этом случае записи (которых нет) из набора не заместят записи из регистра, и данные не очистятся.
Если мы хотим создать новую запись, то необходимо воспользоваться методом Добавить() набора записей регистра сведений, который создает новую запись в нашем наборе.
МенеджерЦеныНаТопливо = РегистрыСведений . ЦеныНаТопливо ;
НаборЗаписей = МенеджерЦеныНаТопливо . СоздатьНаборЗаписей ();
НоваяЗапись = НаборЗаписей . Добавить ();
НоваяЗапись . Период = ТекущаяДата ();
НоваяЗапись . ВидТоплива = ВидТоплива ;
НоваяЗапись . ПоставщикТоплива = ПоставщикТоплива ;
НоваяЗапись . Цена = Цена ;
НаборЗаписей . Записать (Ложь);
Данный код создаст новую запись. В своем коде я работаю с регистром сведений, который создал для предыдущих статей.
Если мы попытаемся еще раз записать точно такой же набор данных, то возникнет ошибка «Запись с такими ключевыми полями существует!»
Причем такой проблемы ни когда не будет при работе с менеджером регистра сведений, так как при работе с менеджером мы получаем данные по измерениям и просто перезаписываем ресурсы и реквизиты.
И обратите внимание, если мы будет записывать с замещением, то проблем с ключевыми полями также не будет, поскольку мы своей записью заместим все имеющиеся данные, т.е. они будут очищены.
При помощи объекта набор записей можно записать в регистр практически неограниченное количество записей. Например, я сделаю выборку по поставщикам топлива и в цикле создам записи нашего набора.
МенеджерЦеныНаТопливо = РегистрыСведений . ЦеныНаТопливо ;
НаборЗаписей = МенеджерЦеныНаТопливо . СоздатьНаборЗаписей ();
Выборка = Справочники . ПоставщикиТоплива . Выбрать ();
Пока Выборка . Следующий () Цикл
НоваяЗапись = НаборЗаписей . Добавить ();
НоваяЗапись . Период = ТекущаяДата ();
НоваяЗапись . ВидТоплива = ВидТоплива ;
НоваяЗапись . ПоставщикТоплива = Выборка . Ссылка ;
НоваяЗапись . Цена = Цена ;
КонецЦикла;
НаборЗаписей . Записать (Ложь);
В этом коде мы создадим несколько записей набора, а потом запишем весь наш набор в регистр сведений.
Изучайте основы конфигурирования в 1С и учитесь программировать в «1С: Предприятии» с помощью моих книг: «Программировать в 1С за 11 шагов» и «Основы разработки в 1С: Такси»
Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»
- Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника;
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Если Вам помог этот урок решить какую-нибудь проблему, понравился или оказался полезен, то Вы можете поддержать мой проект, перечислив любую сумму:
Добрый день.
В проводках ряда документов, почему-то слитело значение субконто1Дт.
Перепроводить документы нельзя, поскольку большинство из них Требования-накладные и при перепроведении обороты будут пересчитаны "по среднему" с учётом уже проводок других документов.
Пытаюсь выбрать необходимые проводки, но не получается записать замену. Пожалуйста, подскажите как будет корректно это сделать.
Ниже мой сырой код:
Процедура ВыбратьПроводкиСПустымиСубконто1Дт()
Запрос = Новый Запрос;
Запрос.Текст ;
Запрос.УстановитьПараметр("Счет0830", ПланыСчетов.Хозрасчетный.НайтиПоКоду("08.30"));
Запрос.УстановитьПараметр("Объекты", ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ОбъектыСтроительства);
Запрос.УстановитьПараметр("ПустойОбъект", Справочники.ОбъектыСтроительства.ПустаяСсылка());
Результат = Запрос.Выполнить();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Объект = ВыборкаДетальныеЗаписи.Документ.Получитьобъект();
ИзменитьДвиженияДокумента(Объект);
Процедура ИзменитьДвиженияДокумента(Объект)
Набор = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(Объект.Ссылка);
Набор.Прочитать();
Для Каждого Запись из Набор Цикл
Если Запись.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("08.30") И Запись.СубконтоДт = Справочники.ОбъектыСтроительства.ПустаяСсылка() Тогда
Запись.СубконтоДт = Справочники.ОбъектыСтроительства.НайтиПоКоду("6.02.00.00.00.00.00");
КонецЕсли;
КонецЦикла;
Набор.Записать();
Конецпроцедуры
вот так все работает нормально.
Я бы посмотрел в отладчике все подробности, может условие не так написано или еще что. Там вроде несложно разобраться.
Условие неверное. Плюс значение субконто может быть равным "Неопределено", а не пустая ссылка
Для записи значения в субконто надо писАть:
подскажите, пожалуйста, в каком формате необходимо указать период для отбора бухгалтерского регистра
с 01.01.2010 00:00:00 по 31.12.2012 23:59:59 ?
Если уже есть отбор по регистратору, то период устанавливать необязательно.
Ну а вообще обычно начальная дата - НачалоДня(Дата1), конечная - КонецДня(Дата2)
спасибо. отбор всё же установил , однако, думаю, что обработка крутится по лишнему циклу несколько раз сначала по выборке, а потом по набору записей:
Процедура ПриОткрытии()
НачПериода = НачалоДня(Дата(2010,02,23,00,00,00));
КонПериода = КонецДня(Дата(2012,12,27,23,59,59));
КонецПроцедуры
Процедура ВыбратьПроводкиСПустымиСубконто1Дт()
Запрос = Новый Запрос;
Запрос.Текст ;
Запрос.УстановитьПараметр("НачПериода", НачПериода);
Запрос.УстановитьПараметр("КонПериода", КонПериода);
Запрос.УстановитьПараметр("Счет0830", ПланыСчетов.Хозрасчетный.НайтиПоКоду("08.30"));
Запрос.УстановитьПараметр("Объекты", ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ОбъектыСтроительства);
Запрос.УстановитьПараметр("ПустойОбъект", Справочники.ОбъектыСтроительства.ПустаяСсылка());
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Объект = ВыборкаДетальныеЗаписи.Регистратор.ПолучитьОбъект();
Сообщить("Выборка " + Объект);
ИзменитьДвиженияДокумента(Объект, ВыборкаДетальныеЗаписи);
КонецЦикла;
Конецпроцедуры
Процедура ИзменитьДвиженияДокумента(Объект,ВыборкаДетальныеЗаписи)
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Значение = ВыборкаДетальныеЗаписи.Регистратор;
НаборЗаписей.Прочитать();
Для Каждого Запись Из НаборЗаписей Цикл
Сообщить("Документ " + Запись.Регистратор);
Если Запись.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("08.30") И Запись.СубконтоДт = Справочники.ОбъектыСтроительства.ПустаяСсылка() Тогда Сообщить("Документ " + ВыборкаДетальныеЗаписи.Регистратор +" Было субконто " + Запись.СубконтоДт + " Сумма " + Запись.Сумма + " Счет " + Запись.СчетДт); Запись.СубконтоДт = Справочники.ОбъектыСтроительства.НайтиПоКоду("6.02.00.00.00.00.00");
Сообщить("Документ " + ВыборкаДетальныеЗаписи.Регистратор +" Стало субконто " + Запись.СубконтоДт + " Сумма " + Запись.Сумма + " Счет " + Запись.СчетДт); КонецЕсли;
КонецЦикла;
НаборЗаписей.Записать();
Сообщить("Записано " + ВыборкаДетальныеЗаписи.Регистратор + " Субконто " + Запись.СубконтоДт);
КонецПроцедуры
Всем огромное спасибо. В итоге получилось так (вроде бы работает):
Процедура КнопкаВыполнитьНажатие(Кнопка)
Сообщить("Время начала " + ТекущаяДата());
ВыбратьПроводкиСПустымиСубконто1Дт();
Сообщить("Время окончания " + ТекущаяДата());
Процедура ВыбратьПроводкиСПустымиСубконто1Дт()
Запрос = Новый Запрос;
Запрос.Текст ;
Запрос.УстановитьПараметр("НачПериода", НачПериода);
Запрос.УстановитьПараметр("КонПериода", КонПериода);
Запрос.УстановитьПараметр("Счет0830", ПланыСчетов.Хозрасчетный.НайтиПоКоду("08.30"));
Запрос.УстановитьПараметр("Объекты", ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ОбъектыСтроительства);
Запрос.УстановитьПараметр("ПустойОбъект", Справочники.ОбъектыСтроительства.ПустаяСсылка());
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Объект = ВыборкаДетальныеЗаписи.Регистратор;
Сообщить("Выборка " + Объект);
ИзменитьДвиженияДокумента(ВыборкаДетальныеЗаписи);
КонецЦикла;
Процедура ИзменитьДвиженияДокумента(ВыборкаДетальныеЗаписи)
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Значение = ВыборкаДетальныеЗаписи.Регистратор;
НаборЗаписей.Прочитать();
Для Каждого Запись Из НаборЗаписей Цикл
Сообщить("Документ " + Запись.Регистратор);
Если Запись.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("08.30") И Запись.СубконтоДт.ОбъектыСтроительства = Справочники.ОбъектыСтроительства.ПустаяСсылка() Тогда
Сообщить("Было субконто " + Запись.СубконтоДт.ОбъектыСтроительства + " Сумма " + Запись.Сумма + " Счет " + Запись.СчетДт);
Запись.СубконтоДт.ОбъектыСтроительства = Справочники.ОбъектыСтроительства.НайтиПоКоду("6.02.00.00.00.00.00");
Сообщить("Стало субконто " + Запись.СубконтоДт.ОбъектыСтроительства + " Сумма " + Запись.Сумма + " Счет " + Запись.СчетДт);
КонецЕсли;
КонецЦикла;
НаборЗаписей.Записать();
Сообщить("Записано " + ВыборкаДетальныеЗаписи.Регистратор + " Субконто " + Запись.СубконтоДт.ОбъектыСтроительства);
КонецПроцедуры
Процедура ВыбПериодНажатие(Элемент)
НастройкаПериода = Новый НастройкаПериода;
НастройкаПериода.РедактироватьКакИнтервал = Истина;
НастройкаПериода.РедактироватьКакПериод = Истина;
НастройкаПериода.ВариантНастройки = ВариантНастройкиПериода.Период;
НастройкаПериода.УстановитьПериод(НачПериода, ?(КонПериода='0001-01-01', КонПериода, КонецДня(КонПериода)));
Если НастройкаПериода.Редактировать() Тогда
НачПериода = НастройкаПериода.ПолучитьДатуНачала();
КонПериода = НастройкаПериода.ПолучитьДатуОкончания();
КонецЕсли;
КонецПроцедуры
Процедура ПриОткрытии()
НачПериода = НачалоДня(Дата(2010,02,23,00,00,00));
КонПериода = КонецДня(Дата(2012,12,27,23,59,59));
КонецПроцедуры
Детективная история
Сразу покажу на небольшом примере почему это так важно.
Пусть у нас есть начисление заработной платы за январь:
В начале февраля мы создаём ведомость на выплату зарплаты из кассы и нажимаем кнопку "Заполнить":
И получаем следующее:
Но ведь за январь:
- Начисление 50 000 рублей
- НДФЛ 6 500 рублей
- Итого к выплате 43 500 рублей
Где закралась ошибка? Что пошло не так? Неужели теперь всегда вводить сумму к выплате вручную?
Опытный бухгалтер тут же сделает оборотно-сальдовую ведомость по 70 счёту:
И будет в ещё большем недоумении, потому что по данным отчёта к выплате выходят всё те же 43 500! И откуда же взялись лишние 5 000 рублей?
Причём такая ситуация (с любыми расчётами) может произойти как в "тройке", так и в "двойке".
Сегодня я попытаюсь приоткрыть завесу тайны - почему же иногда программа ведёт себя так странно. Я расскажу как в таких случаях находить и устранять ошибку. Ближе к концу статьи мы разберёмся - откуда же взялись эти самые 5 000 рублей.
Учимся видеть регистры
При проведении документов 1С:Бухгалтерия 8 делает проводки по бухгалтерским счетам (кнопка ДтКт у любого документа):
Именно на основании этих проводок строятся все бухгалтерские отчёты: Анализ счёта, Карточка счёта, Оборотно-сальдовая ведомость.
Но есть огромный пласт данных, которые пишутся программой параллельно с проводками и используются для всего остального: заполнение КУДИР, книги покупок и продаж, регламентированной отчётности. заработной платы к выплате, наконец
Как вы уже, наверное, догадались этот пласт называется регистрами, вот он:
Я сейчас не буду вдаваться в подробности описания самих регистров, чтобы не запутать вас ещё больше.
Скажу лишь, что нам просто жизненно необходимо постепенно учиться "видеть" движения по этим регистрам, чтобы лучше понимать и, когда надо, корректировать поведение программы.
Давайте присмотримся к регистру "Зарплата к выплате" - именно он имеет смысл для решения нашей проблемы с лишними 5 000:
Мы видим две записи по этому регистру, сделанные в приход, то есть в плюс. Если пролистать экран в право, то мы увидим в первой строчке сумму к выплате "-6 500", а во второй "50 000".
Остаток по этому регистру -6 500 + 50 000 равен 43 500, который и должен попасть в документ "Ведомость на выплату из кассы", когда мы нажимаем на кнопку "Заполнить".
Ещё раз повторюсь - ведомость на выплату определяет нашу задолженность по заработной плате перед сотрудником не по 70 счёту, а по регистру "Зарплата к выплате" .
Получается мы знаем, что зарплата к выплате заполняется на основании этого регистра, но даже видя записи регистра не можем понять что не так.
Скорее всего мы не видим всей картины (может быть существуют другие записи по этому регистру) и напрашивается некий инструмент для анализа регистра подобный бухгалтерским отчётам.
Учимся анализировать регистры
И такой инструмент есть, он называется "Универсальный отчёт".
Переходим в раздел "Отчеты" пункт "Универсальный отчёт":
Выбираем тип регистра "Регистр накопления", регистр "Зарплата к выплате" и нажимаем кнопку "Сформировать":
Получилось не очень информативно:
Всё потому, что требуется предварительная настройка отчёта, нажимаем кнопку "Показать настройки" и на закладке "Группировка" добавляем поле "Сотрудник":
На закладке "Отборы" делаем отбор по нашей организации:
Нажимаем кнопку "Сформировать":
Вот это уже более интересно. Видим остаток к выплате нашему сотруднику те самые 48 500 рублей!
Снова заходим в настройки отчёта и добавляем на закладку "Показатели" новое поле "Регистратор":
Снова формируем отчёт:
Вот теперь мы прекрасно видим, что 5 000 появились как результат операции (видимо ввода остатков) 31 декабря 2014 года.
И нам нужно либо изменить эту операцию, либо вручную откорректировать регистр "Зарплата к выплате" и закрыть эти 5 000 рублей, например, 31 декабря 2015 года.
Давайте пойдём вторым путём. Итак, наша задача - сделать так, чтобы на начало 2016 года по регистру "Зарплата к выплате" не было нашей задолженности перед сотрудником.
Это делается ручной операцией.
Учимся корректировать регистры
Заходим в раздел "Операции" пункт "Операции, введенные вручную":
Создаём новую операцию концом 2015 года:
Из меню "Ещё" выбираем пункт "Выбор регистров. ":
Указываем регистр "Зарплата к выплате" и нажимаем ОК:
Переходим на появившуюся закладку регистра и делаем расход на 5 000 рублей:
Этим самым мы как бы отнимаем от регистра 5 000 рублей по сотруднику, чтобы выйти на ноль к началу 2016 года.
Проводим операцию и заново формируем универсальный отчёт:
Всё получилось! Видим, что наша ручная операция от 31.12.2015 вывела остаток в ноль и зарплата к выплате после начисления равна ожидаемым 43 500.
Замечательно. И сейчас мы проверим это в ведомости на выплату.
Но прежде я хочу обратить ваше внимание на ещё один важный момент:
Обратите внимание, что остатки на начало и на конец по группировке "Сотрудник" показывают ерунду. Это никакая не ошибка, это нюанс, который нужно учитывать, связанный с архитектурными особенностями 1с.
Запомните. В том случае, если универсальный отчёт выводится с детализацией до документа (регистратора) - остатки по группировкам будут показывать ерунду.
Если нам требуются остатки по группировке сотрудник - нужно сначала удалить из настроек добавленный нами показатель "Регистратор":
И только потом формировать отчёт:
Сейчас остатки показаны корректно.
Результат
Напоследок убедимся, что мы сделали всё правильно. Снова заходим в ведомость на выплату заработной платы за январь и нажимаем кнопку "Заполнить":
Мы молодцы, на этом пока всё
Кстати, подписывайтесь на новые уроки.
С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).
Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.
В некоторых типовых конфигурациях фирмы 1С существует возможность ручной корректировки движений документа по регистрам. В конфигурации 1С: Бухгалтерия 8 для этого, при наличии соответствующих прав, нужно открыть движения документа и установить флаг “Ручная корректировка”. Однако, иногда возникает необходимость выполнить корректировку движений большого количества документов. В этом случае нам понадобится обработка, которая изменит движения документов без перепроведения.
Рассмотрим как изменить движения документа на примере конфигурации 1С: Бухгалтерия 8. Менять будем движения по регистру бухгалтерии “Хозрасчетный”. Пусть перед нами стоит задача заполнить суммы налогового учета по данным бухгалтерского. Предположим, что у нас уже есть обработка, которая выбирает необходимые нам документы и последовательно обрабатывает их с помощью описанной нами процедуры “ИзменитьДвиженияДокумента”. Посмотрим как должна выглядеть эта процедура.
Процедура ИзменитьДвиженияДокумента ( ДокументСсылка )
// прочитаем набор записей регистра по документу
НаборЗаписей = РегистрыБухгалтерии . Хозрасчетный . СоздатьНаборЗаписей ( ) ;
НаборЗаписей . Отбор . Регистратор . Установить ( ДокументСсылка ) ;
НаборЗаписей . Прочитать ( ) ;
Если НаборЗаписей . Количество ( ) = 0 Тогда
Возврат ;
КонецЕсли ;
// переберем все записи набора и заполним суммы по налоговому учету
Для каждого Запись из НаборЗаписей Цикл
// перед изменением сумм проверяем ведется ли налоговый учет на выбранном счёте
Если Запись . СчетДт . НалоговыйУчет Тогда
Запись . СуммаНУДт = Запись . Сумма ;
КонецЕсли ;
Если Запись . СчетКт . НалоговыйУчет Тогда
Запись . СуммаНУКт = Запись . Сумма ;
КонецЕсли ;
КонецЦикла ;
// установим признак обмена данными
НаборЗаписей . ОбменДанными . Загрузка = Истина ;
НаборЗаписей . Записать ( ) ;
// установим признак ручной корректировки документа,
// предварительно установив признак обмена данными
ДокументОбъект = ДокументСсылка . ПолучитьОбъект ( ) ;
ДокументОбъект . ОбменДанными . Загрузка = Истина ;
ДокументОбъект . РучнаяКорректировка = Истина ;
ДокументОбъект . Записать ( ) ;
КонецПроцедуры
Хотелось бы отметить, что без проверки ведения налогового учета на счёте, при попытке записать набор, содержащий проводку с ненулевой суммой по счёту на котором не ведется налоговый учет, возникнет ошибка следующего содержания:
Запись не верна! Поле “Сумма (налоговый учет)” должно быть пустым! (Регистр бухгалтерии: Журнал проводок (бухгалтерский и налоговый учет); Номер строки: 1)
Режим обмена данными устанавливается следующими строками:
. . .
НаборЗаписей . ОбменДанными . Загрузка = Истина ;
. . .
ДокументОбъект . ОбменДанными . Загрузка = Истина ;
. . .
Это необходимо для того, чтобы не выполнялся программный код, находящийся в обработчиках событий “ПередЗаписью” модуля набора записей регистра бухгалтерии “Хозрасчетный” и модуля корректируемого документа. В каждом из них (для типовых конфигураций) есть проверка следующего вида:
Движения документа отредактированы вручную и не могут быть автоматически актуализированы
Статья найдена на просторах интернета
Реклама — это искусство делать из полуправды целую ложь.
— Эдгар Шоафф
В этой статье мы научимся программно работать с регистром сведений, используя объект Менеджер записи регистра сведений.
Перед тем как начать основную тему замечу: для того чтобы программно работать непосредственно с регистром сведений: создать новую запись, удалить или редактировать имеющуюся, получать выборку или срез первых (последних) и т.п., — необходимо работать с объектом Менеджер регистров, а после уже можно проводить различные вышеперечисленные манипуляции с регистром сведений.
Создать менеджер регистра сведений достаточно просто, например:
Хочу заметить, что работать с менеджером регистра сведений можно или в толстом клиенте, или в серверном контексте. В тонком клиенте код, написанный в этой статье работать не будет!
Для того, чтобы программным способом создать, редактировать или удалить конкретную запись независимого регистра сведений, необходимо использовать объект РегистрСведенийМенеджерЗаписи. С помощью данного объекта можно получить доступ к записи с необходимым набором полей. Создается менеджер записи с помощью функции менеджера регистров СоздатьМенеджерЗаписи.
Переменная МенеджерЗаписи, которую мы создали, имеет тип РегистрСведенийМенеджерЗаписи, этот тип предназначен для чтения, редактирования и удаления конкретной записи. Мы можем обращаться к измерениям, ресурсам и реквизитам регистра сведений как к свойствам данного объекта. Заполним созданную запись.
Объект РегистрСведенийМенеджерЗаписи позволяет управлять записью регистра сведений и применим только для независимых регистров. Доступ к записи обеспечивается путем присвоения значений полям объекта, которые соответствуют измерениям, ресурсам и реквизитам регистра. В Вашем примере это измерения Период, ВидТоплива и Поставщик, а также ресурс Цена.
Переменные, которые присваиваются полям регистра в моем случае это реквизиты управляемой формы 1С.
Относительно периода замечу, что платформа самостоятельно изменит текущую дату на дату начала периода, который установлен в свойстве периодичность регистра сведений (если периодичность месяц, а в период передана дата 21.12.2017, то запишется 01.12.2017).
В данном примере я не выясняю, есть ли уже запись с заданным набором ключевых полей (измерений), а просто записываю ее, поэтому если такая запись уже есть, то она перезапишется.
Как сделать так, чтобы регистр ЦеныНаТопливо не перезаписывался при одинаковых измерениях и периоде? Для этого нам понадобятся два метода объекта РегистрСведенийМенеджерЗаписи — метод Прочитать и метод Выбран.
Метод Прочитать считывает данные регистра по указанным измерениям и периоду, а метод Выбран возвращает Истину, если есть запись с указанными полями, и Ложь, если такой нет.
В этом случае наш код изменится.
В этом случае мы присваиваем значения ключевым полям (измерениям) и периоду. А после применяем метод Прочитать. Данный метод считывает записи с регистра по указанным ключевым полям (измерениям) и периоду. Если есть записи с данным набором полей, то метод Выбран возвращает Истину, иначе – Ложь. В Вашем примере, если метод Выбран вернул значение Ложь (записей нет), то мы присваиваем значения измерениям и ресурсу и записываем.
Если же нам нужно будет удалить запись с заданным набором измерений, то код немного поменяется.
Изучайте основы конфигурирования в 1С и учитесь программировать в «1С: Предприятии» с помощью моих книг: «Программировать в 1С за 11 шагов» и «Основы разработки в 1С: Такси»
Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»
- Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника;
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Если Вам помог этот урок решить какую-нибудь проблему, понравился или оказался полезен, то Вы можете поддержать мой проект, перечислив любую сумму:
Читайте также: