В этой статье мы научимся программным способом изменять независимые регистры сведений.
Более подробно о регистрах сведений, их видах и о многом другом читайте в моей книге «Программировать в 1С за 11 шагов».
Для того что бы понять и изучить, принципы программной с регистрами сведений, сделаем небольшую задачу на тестовой конфигурации «Управляемое приложение 1С». Создадим обработку, которая будет менять цены определенного вида у всех товаров на определенную дату.
В конфигурации «Управляемое приложение» цены товаров хранятся в независимом периодическом регистре сведений, который имеет следующие данные
Периодичность этого регистра сведений день.
Создадим внешнюю обработку, которую назовем «ИзменитьЦены», и у которой будет один реквизит ВидЦены (тип СправочникСсылка.ВидыЦен), второй реквизит – Процент (тип число), а третий реквизит – Дата (тип Дата). Создадим команду «Изменить цену», которую разместим в командной панели.
Для команды «Изменить цену» создадим обработчики на сервере и на клиенте, где будем изменять данные регистра сведений ЦеныТоваров.
&НаСервере
Процедура ИзменитьЦенуНаСервере ()
РегистрЦены = РегистрыСведений . ЦеныТоваров . СоздатьНаборЗаписей (); //1
РегистрЦены . Отбор . ВидЦен . Установить ( ВидЦены ); //2
РегистрЦены . Отбор . Период . Установить ( НачалоДня ( Дата )); //3
РегистрЦены . Прочитать (); //4
Для Каждого стрНабора из РегистрЦены Цикл
стрНабора . Цена = стрНабора . Цена *(( 100 + Процент )/ 100 ); //5
КонецЦикла;
РегистрЦены . Записать (); //6
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьЦену ( Команда )
ИзменитьЦенуНаСервере ();
КонецПроцедуры
Разберем код на листинге выше. В строке //1 мы создаем набор записей регистра сведений «ЦеныТоваров» с этим набором мы и будем в дальнейшем осуществлять все операции.
Тот набор записей, который мы получили, в принципе, он весь будет содержать все записи регистра сведений, после того как мы его прочтем, а нам нужно обработать только часть этого набора. Поэтому мы в строках //2 и //3 накладываем отборы на регистр сведений. Имейте в виду, что отбор в регистрах сведений можно устанавливать только на равенство! В строка //4 мы прочитали данные регистра сведений, и теперь можем к объекту РегистрЦены обращаться как к коллекции. Что мы и делаем в цикле ниже – мы обходим коллекцию, и в каждой итерации цикла изменяем цену (строка //5). В строке //6 просто записываем объект РегистрЦены, после этого наши изменения появятся в базе.
Теперь поставим более сложную задачу: нам нужно пересчитать цены за какой-то конкретный период. Например, за весь год. В этом случае мы не можем воспользоваться отбором за весь период.
Если мы попробуем так сделать, то возникнет ошибка «Недопустимый тип сравнения».
Поэтому приходится выдумывать различные методы. Я покажу два из них. В первом мы с помощью запроса получим данные из регистра с отбором по нужному виду цен (это будут все данные), и изменим в поле запроса цены, которые будут входить в заданный период. После этого получим выгрузку из запроса. Создадим набор записей регистра накопления с отбором по нужному виду цен (это обязательно, иначе мы затрем всё остальное), прочитаем этот отбор и загрузим в него нашу выгрузку из запроса. После того как мы запишем регистр, обновятся все записи для данного вида цен, но только у тех, которые входят в период, пересчитается дата. Код данного алгоритма ниже. Период – это реквизит формы с типом СтандартныйПериод.
&НаСервере
Процедура ИзменитьЦенуНаСервере ()
Запрос = Новый Запрос ;
Запрос . Текст = «ВЫБРАТЬ
| ЦеныТоваров.Период КАК Период,
| ЦеныТоваров.Товар КАК Товар,
| ЦеныТоваров.ВидЦен КАК ВидЦен,
| ВЫБОР
| КОГДА ЦеныТоваров.Период >= НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ)
| И ЦеныТоваров.Период Запрос . УстановитьПараметр ( «ДатаНачала» , Период . ДатаНачала );
Запрос . УстановитьПараметр ( «ДатаКонца» , Период . ДатаОкончания );
Запрос . УстановитьПараметр ( «ВидЦен» , ВидЦены );
Запрос . УстановитьПараметр ( «ПроцентЦены» , Процент );
Результат = Запрос . Выполнить ();
Если Результат . Пустой () Тогда
Сообщить ( «Нет данных в регистре по заданному отбору» );
Возврат;
КонецЕсли;
Выгрузка = Результат . Выгрузить ();
РегистрЦены = РегистрыСведений . ЦеныТоваров . СоздатьНаборЗаписей ();
РегистрЦены . Отбор . ВидЦен . Установить ( ВидЦены );
РегистрЦены . Прочитать ();
РегистрЦены . Загрузить ( Выгрузка );
РегистрЦены . Записать ();
КонецПроцедуры
Второй способ – будем получать записи регистра сведений с отбором по цене, выгружать их в таблицу значений, потом эту таблицу значений изменим (те записи, которые соответствуют нашему периоду), и загрузим обратно в регистр сведений. Код этого способа ниже. Изменять таблицу значений мы будем с помощью запроса.
&НаСервере
Процедура ИзменитьЦенуНаСервере ()
РегистрЦены = РегистрыСведений . ЦеныТоваров . СоздатьНаборЗаписей ();
РегистрЦены . Отбор . ВидЦен . Установить ( ВидЦены );
РегистрЦены . Прочитать ();
ТаблицаСРегистра = РегистрЦены . Выгрузить ();
Запрос = Новый Запрос ;
Запрос . Текст = «ВЫБРАТЬ
| ТаблицаВыгрузки.Период КАК Период,
| ТаблицаВыгрузки.ВидЦен КАК ВидЦен,
| ТаблицаВыгрузки.Товар КАК Товар,
| ТаблицаВыгрузки.Цена КАК Цена
|ПОМЕСТИТЬ втТаблица
|ИЗ
| &ТаблицаВыгрузки КАК ТаблицаВыгрузки
|
|ИНДЕКСИРОВАТЬ ПО
| ВидЦен,
| Товар
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| втТаблица.Период КАК Период,
| втТаблица.ВидЦен КАК ВидЦен,
| втТаблица.Товар КАК Товар,
| ВЫБОР
| КОГДА втТаблица.Период >= НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ)
| И втТаблица.Период Запрос . УстановитьПараметр ( «ДатаНачала» , Период . ДатаНачала );
Запрос . УстановитьПараметр ( «ДатаКонца» , Период . ДатаОкончания );
Запрос . УстановитьПараметр ( «ТаблицаВыгрузки» , ТаблицаСРегистра );
Запрос . УстановитьПараметр ( «ПроцентЦены» , Процент );
Результат = Запрос . Выполнить ();
Выгрузка = Результат . Выгрузить ();
РегистрЦены . Загрузить ( Выгрузка );
РегистрЦены . Записать ();
КонецПроцедуры
Подробности об использовании таблиц значений в запросах Вы узнаете в моем курсе «Запрос в 1С: от новичка до профи».
Если брать мои замеры производительности, то первый способ в разы быстрее второго.
Хотя, если честно, то я не соблюдал какую-то особую чистоту эксперимента, поэтому не могу со стопроцентной достоверностью утверждать какой из вышеприведенных способов эффективнее. Решать Вам.
Точно так же при помощи менеджера регистра сведений можно добавлять данные. Поставим задачу: взять все товары с определенным видом цен и увеличить их на нужный процент, но мы не будем редактировать записи, а просто добавим новые на текущую дату.
&НаСервере
Процедура ИзменитьЦенуНаСервере ()
Запрос = Новый Запрос ;
Запрос . Текст = «ВЫБРАТЬ
| ЦеныТоваровСрезПоследних.Товар КАК Товар,
| ЦеныТоваровСрезПоследних.Цена * ((100 + &ПроцентЦены) / 100) КАК Цена,
| &ВидЦены КАК ВидЦен,
| НАЧАЛОПЕРИОДА(&ТекущаяДата, ДЕНЬ) КАК Период
|ИЗ
| РегистрСведений.ЦеныТоваров.СрезПоследних(, ВидЦен = &ВидЦены) КАК ЦеныТоваровСрезПоследних»;
Запрос . УстановитьПараметр ( «ВидЦены» , ВидЦены );
Запрос . УстановитьПараметр ( «ПроцентЦены» , Процент );
Запрос . УстановитьПараметр ( «ТекущаяДата» , ТекущаяДата ());
Выборка = Запрос . Выполнить (). Выбрать ();
РегистрЦены = РегистрыСведений . ЦеныТоваров . СоздатьНаборЗаписей ();
РегистрЦены . Отбор . Период . Установить ( НачалоДня ( ТекущаяДата ()));
РегистрЦены . Прочитать ();
РегистрЦены . Очистить ();
Пока Выборка . Следующий () Цикл
НоваяЗапись = РегистрЦены . Добавить ();
ЗаполнитьЗначенияСвойств ( НоваяЗапись , Выборка );
КонецЦикла;
РегистрЦены . Записать ();
КонецПроцедуры
В этом коде я при помощи виртуальной таблицы регистра сведений СрезПоследних получаю все товары и цены на текущую дату. Подробно о работе виртуальных таблиц регистров сведений смотрите в моем курсе «Запрос в 1С: от новичка до профи». Потом мы отбираем все записи регистра сведений на текущую дату и очищаем их на всякий случай. А дальше используя функцию Добавить() набора записей регистра, добавляем что нам нужно.
Изучайте основы конфигурирования в 1С и учитесь программировать в «1С: Предприятии» с помощью моих книг: «Программировать в 1С за 11 шагов» и «Основы разработки в 1С: Такси»
Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»
- Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника;
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Если Вам помог этот урок решить какую-нибудь проблему, понравился или оказался полезен, то Вы можете поддержать мой проект, перечислив любую сумму:
можно оплатить вручную:
Яндекс.Деньги — 410012882996301
Web Money — R955262494655
При обновлении конфигурации 1С может появиться предупреждение о том, что записи каких-то регистров сведений стали неуникальными. Рассмотрим порядок действий для исправления данной ошибки.
Причины возникновения ошибки
Связано это может быть с несколькими причинами:
- не последовательным обновлением конфигурации релиз за релизом, а «перепрыгиванием» сразу через несколько релизов;
- конфликтом введенных в базу данных самим пользователем и добавленных в конфигурацию разработчиками предопределенных значений;
- ошибками переноса баз данных в новые конфигурации;
- доработкой конфигурации самим пользователем.
Какой бы ни была причина появления этой ошибки, она говорит об одном: в регистре сведений есть запись с ключевыми параметрами, для которой имеется несколько значений, и программа 1С не знает: какая из этих записей правильная.
Ключевые параметры регистра сведений называются Измерениями , а значения по измерениям указываются в Ресурсах . PDF По правилам записи в регистры сведений ключевые параметры определяют значение ОДНОЗНАЧНО.
При работе в пользовательском режиме при попытке записи в регистр разных данных с одинаковыми ключевыми параметрами выдается ошибка, не позволяющая провести документ. PDF Пользователь при этом сразу видит ошибку, понимает в чем дело и исправляет ее.
В режиме обновления конфигурации ситуация более сложная, хотя отслеживание таких ситуаций регулируется в большинстве случаев в 1С автоматически. Разработчики вносят в программу изменения таким образом, что программа сама, по заложенному алгоритму и анализу данных, определяет какая из записей неактуальна и удаляет ее, продолжив обновление.
Но бывают случаи, когда определить самостоятельно какую из записей оставить, а какую удалить, программа 1С не может и тогда пользователь уже должен сам исправить ситуацию. Обычно это происходит при удалении каких-то ключевых параметров из регистра сведений в новом обновлении и наиболее часто проявляется у любителей «обновляться редко, но сразу на последний релиз».
При возникновении ошибки будет выдано предупреждение о возникшей ситуации с регистром, которое не позволит продолжить обновление, пока не будет исправлена ошибка.
В новой версии конфигурации был изменен регистр Цены номенклатуры . PDF При обновлении конфигурации было выдано предупреждение о возникших неуникальных записях по этому регистру. PDF
Исправление ошибки «Записи регистра сведений стали неуникальными»
Последовательное обновление конфигурации без «пропусков»
Если конфигурация типовая и изменений в нее пользователем не вносилось, проведите обновление последовательно всеми вышедшими релизами, без пропусков. Возможно, разработчики что-то убирали в коде, а в следующем релизе — добавляли и пропуск этих промежуточных релизов привел к ошибке заполнения каких-то данных регистра по умолчанию.
При возникновении ошибки обновите текущую конфигурацию, например, Бухгалтерия предприятия 3.0.67.54 не сразу на релиз 3.0.67.72, а последовательно на:
Если это не помогло, используйте следующие рекомендации.
При последовательном обновлении запускаются специализированные обработчики, которые могут исключить данную ошибку автоматически.
Настройка автоматического обновления
Настройте автоматическое обновление 1С: раздел Администрирование — Настройки программы — Интернет-поддержка и сервисы — Обновление версии программы .
При автоматическом обновлении подобная ошибка, как правило, не появляется, так как все изменения разработчиков в «промежуточных» релизах, которые может пропустить пользователь при самостоятельном обновлении, учитываются автоматически.
Для автоматического обновления программы 1С должна быть настроена Интернет-поддержка.
Сравнение конфигураций
В самых сложных случаях придется сравнить основную конфигурацию с конфигурацией базы данных, анализ данных последней и приводит к ошибке.
Основная конфигурация – это обновляемая конфигурация программы. В типовых, не измененных программах 1С она совпадает с конфигурацией поставщика. После обновления конфигурации, запускается процесс обновления Конфигурации базы данных, в которой еще содержатся старые данные до тех пор, пока процесс обновления не завершится полностью.
В момент появления ошибки основная конфигурация и конфигурация базы данных отличаются. Именно появление ошибки и мешает завершению обновления конфигурации базы данных. Поэтому нужно разобраться, что происходит и какие данные в базе мешают ее обновлению.
Пошаговая инструкция сравнения основной конфигурации и конфигурации базы данных.
Шаг 1. Открытие Конфигуратора.
Войдите в Конфигуратор информационной базы.
Откройте конфигурацию по кнопке Конфигуратор — Открыть конфигурацию . В правом окне откроется список всех объектов 1С.
Выберите команду Сравнить конфигурации .
Шаг 2. Настройка сравнения конфигураций.
Установите настройки как показано на рисунке.
Шаг 3. Запуск сравнения конфигураций.
Нажмите на кнопку ОК . Программа 1С выдаст окно сравнения конфигураций, в котором нужно перейти на регистр сведения Цены номенклатуры и раскрыть различия, нажав на «+» справа от объекта.
Шаг 4. Исправление ошибки.
Из таблицы сравнения видно, что в регистре Цены номенклатуры в основной конфигурации отсутствует параметр измерения Тип цен .
Войдите в базу данных и откройте регистр Цены номенклатуры : кнопка Главное меню — Все функции — Регистры сведений — Цены номенклатуры .
Как видно из рисунка, сейчас в регистре сведений Цены номенклатуры для Комплекта постельного белья две записи для типов цен:
- Продажная — 3 670 руб.;
- Оптовая — 2 090 руб.
Поскольку реквизит Тип цен был удален из основной конфигурации, в регистре сведений должно остаться две записи с разными ценами на одинаковые ключевые параметры для Комплекта постельного белья. Правила записи в регистр этого не допускают, и программа 1С выдает ошибку при обновлении базы данных.
Удалите одну из записей для Комплекта постельного белья и выполните обновление сначала. На этот раз никаких ошибок программа 1С не выдаст!
Если причину самостоятельно, используя указанные рекомендации, отыскать не удалось, базу придется передать профессионалам 1С для исправления.
Если Вы еще не являетесь подписчиком системы БухЭксперт8:
После оформления подписки вам станут доступны все материалы по 1С Бухгалтерия, записи поддерживающих эфиров и вы сможете задавать любые вопросы по 1С.
Получите еще секретный бонус и полный доступ к справочной системе БухЭксперт8 на 14 дней бесплатно
Похожие публикации
- Ошибка формата потока 1С 8.3: как исправитьПри работе с программой 1С либо при запуске информационной базы.
- Регистрация конфигурации в центре лицензирования не выполнена: как убратьПо данным сайта 1С был изменен цифровой сертификат безопасности на.
- Печатная форма недоступна 1С 8.3 при вызове внешней печатной формыПри подключении внешних печатных форм в 1С может появиться ошибка.
Карточка публикации
Разделы: | Законодательство (ЗУП), Зарплата (ЗУП), Кадры (ЗУП), Настройки (ЗУП) |
---|---|
Рубрика: | Ошибки в 1С |
Объекты / Виды начислений: | |
Последнее изменение: | 13.04.2019 |
>ID, ‘post_tag’ ); // так как функция вернула массив, то логично будет прокрутить его через foreach() foreach( $termini as $termin ) name . »; > /* * Также вы можете использовать: * $termin->ID — понятное дело, ID элемента * $termin->slug — ярлык элемента * $termin->term_group — значение term group * $termin->term_taxonomy_id — ID самой таксономии * $termin->taxonomy — название таксономии * $termin->description — описание элемента * $termin->parent — ID родительского элемента * $termin->count — количество содержащихся в нем постов */ —>
Добавить комментарий Отменить ответ
Для отправки комментария вам необходимо авторизоваться или зарегистрироваться.
Вы можете задать еще вопросов
Доступ к форме «Задать вопрос» возможен только при оформлении полной подписки на БухЭксперт8.
Оформить заявку от имени Юр. или Физ. лица вы можете здесь >>
Нажимая кнопку «Задать вопрос», я соглашаюсь с
регламентом БухЭксперт8.ру >>
В этой статье мы подробно рассмотрим, как программно изменить запись регистра сведений и разберем примеры работы с независимыми регистрами сведений и регистрами с подчинением регистраторам.
Рекомендуем Вам тестовое изменение записей в регистре сведений выполнять на копии информационной базы .
Если Вы нуждаетесь в готовом решении по быстрому изменению записей регистра сведений — обратите внимание на нашу разработку Изменение записей регистра сведений . Обработка позволит Вам решить все задачи по изменению записей в регистре сведений и значительно сэкономить время на разработку аналогичного решения!