1С 8.3 Регистры сведений
Данные > Примеры кода 1С > 1С 8.3 Регистры сведений
Регистры сведений в 1С 8.3 - это объекты метаданных, которые нужны для хранения справочной информации в разрезе нескольких измерений. Пример применения регистра сведений - хранение, с привязкой к периоду, цен предприятия в разрезе товаров и типов цен или курсов валют в разрезе валют. Данные в регистре сведений хранятся в виде записей, каждая из которых содержит значения измерений и соответствующие им значения ресурсов:
- Измерения регистра сведений описывают разрезы, в которых хранится информация
- Ресурсы регистра сведений соответственно хранят саму информацию
Для периодических регистров сведений доступны две виртуальные таблицы СрезПоследних и СрезПервых.
Виртуальные таблицы облегчают жизнь разработчику, так как:
- Не нужно самому писать запросы с данной логикой работы, обращаясь к основной таблице регистра сведений;
- Тонкости организации оптимального получения данных обеспечиваются самой платформой.
Оглавление:
Чтение записи регистра сведений в 1С 8.3:
&НаСервере
Процедура ЧтениеЗаписи()
// Чтение всех записей регистра "ЦеныРеализации" по организации ОАО "Гипермаркет АЗИЯ" (упорядоченных по дате).
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЦеныРеализации.Период,
| ЦеныРеализации.Регистратор,
| ЦеныРеализации.НомерСтроки,
| ЦеныРеализации.Активность,
| ЦеныРеализации.Номенклатура,
| ЦеныРеализации.Контрагент,
| ЦеныРеализации.Организация,
| ЦеныРеализации.Цена
|ИЗ
| РегистрСведений.ЦеныРеализации КАК ЦеныРеализации
|ГДЕ
| ЦеныРеализации.Организация = &ВыбОрганизация
|УПОРЯДОЧИТЬ ПО
| ЦеныРеализации.Период";
Запрос.УстановитьПараметр("ВыбОрганизация", Справочники.Организации.НайтиПоНаименованию("ОАО ""Гипермаркет АЗИЯ"""));
РезультатЗапроса = Запрос.Выполнить();
Записи = РезультатЗапроса.Выбрать();
Пока Записи.Следующий() Цикл
Сообщить("за " + Записи.Период + " на " +Записи.Номенклатура + " " + Записи.Контрагент + " = " +Записи.Цена + " руб.");
КонецЦикла;
КонецПроцедуры
Процедура ЧтениеЗаписи()
// Чтение всех записей регистра "ЦеныРеализации" по организации ОАО "Гипермаркет АЗИЯ" (упорядоченных по дате).
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЦеныРеализации.Период,
| ЦеныРеализации.Регистратор,
| ЦеныРеализации.НомерСтроки,
| ЦеныРеализации.Активность,
| ЦеныРеализации.Номенклатура,
| ЦеныРеализации.Контрагент,
| ЦеныРеализации.Организация,
| ЦеныРеализации.Цена
|ИЗ
| РегистрСведений.ЦеныРеализации КАК ЦеныРеализации
|ГДЕ
| ЦеныРеализации.Организация = &ВыбОрганизация
|УПОРЯДОЧИТЬ ПО
| ЦеныРеализации.Период";
Запрос.УстановитьПараметр("ВыбОрганизация", Справочники.Организации.НайтиПоНаименованию("ОАО ""Гипермаркет АЗИЯ"""));
РезультатЗапроса = Запрос.Выполнить();
Записи = РезультатЗапроса.Выбрать();
Пока Записи.Следующий() Цикл
Сообщить("за " + Записи.Период + " на " +Записи.Номенклатура + " " + Записи.Контрагент + " = " +Записи.Цена + " руб.");
КонецЦикла;
КонецПроцедуры
Поиск и программное изменение записи документа в регистр сведений в 1С 8.3:
&НаСервере
Процедура ПоискИИзменениеЗаписи()
УстановкаЦенСсылка = Документы.УстановкаЦен.НайтиПоНомеру("ПТО-00000001", '20201231');
УстановкаЦен = УстановкаЦенСсылка.ПолучитьОбъект();
// Получение набора записей документа Установка цен № ПТО-00000001 от 31.12.20 в регистр "ЦеныРеализации"
НаборЗаписей = УстановкаЦен.Движения.ЦеныРеализации;
// Чтение набора записей из базы данных.
НаборЗаписей.Прочитать();
Для Каждого Запись Из НаборЗаписей Цикл
// Получение старых значений
Сообщить(" по " + Запись.Организация + ", " + Запись.Контрагент + ", " + Запись.Номенклатура + " = " + Запись.Цена);
// Проведение удорожания на 30%
Запись.Цена = Запись.Цена + (Запись.Цена * (30/100));
КонецЦикла;
// Добавление новой записи
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Период = ТекущаяДата();
НоваяЗапись.Организация = Справочники.Организации.НайтиПоНаименованию("ОАО ""Гипермаркет АЗИЯ""");
НоваяЗапись.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО ""БелИмпортТорг""");
НоваяЗапись.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Молоко 3,2%");
НоваяЗапись.Цена = 3;
// Замещение старых записей и запись новых
НаборЗаписей.Записать(Истина);
КонецПроцедуры
Процедура ПоискИИзменениеЗаписи()
УстановкаЦенСсылка = Документы.УстановкаЦен.НайтиПоНомеру("ПТО-00000001", '20201231');
УстановкаЦен = УстановкаЦенСсылка.ПолучитьОбъект();
// Получение набора записей документа Установка цен № ПТО-00000001 от 31.12.20 в регистр "ЦеныРеализации"
НаборЗаписей = УстановкаЦен.Движения.ЦеныРеализации;
// Чтение набора записей из базы данных.
НаборЗаписей.Прочитать();
Для Каждого Запись Из НаборЗаписей Цикл
// Получение старых значений
Сообщить(" по " + Запись.Организация + ", " + Запись.Контрагент + ", " + Запись.Номенклатура + " = " + Запись.Цена);
// Проведение удорожания на 30%
Запись.Цена = Запись.Цена + (Запись.Цена * (30/100));
КонецЦикла;
// Добавление новой записи
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Период = ТекущаяДата();
НоваяЗапись.Организация = Справочники.Организации.НайтиПоНаименованию("ОАО ""Гипермаркет АЗИЯ""");
НоваяЗапись.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО ""БелИмпортТорг""");
НоваяЗапись.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Молоко 3,2%");
НоваяЗапись.Цена = 3;
// Замещение старых записей и запись новых
НаборЗаписей.Записать(Истина);
КонецПроцедуры
Чтение записи документа в регистре сведений запросом в 1С 8.3:
&НаСервере
Процедура ЧтениеЗаписиЗапросом()
// Если не требуется изменять найденные записи.
СсылкаДок = Документы.УстановкаЦен.НайтиПоНомеру("ПТО-00000001", '20201231');
// Чтение запросом записей регистра сведений "ЦеныРеализации" текущего документа
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЦеныРеализации.Период,
| ЦеныРеализации.Регистратор,
| ЦеныРеализации.НомерСтроки,
| ЦеныРеализации.Активность,
| ЦеныРеализации.Номенклатура,
| ЦеныРеализации.Контрагент,
| ЦеныРеализации.Организация,
| ЦеныРеализации.Цена
|ИЗ
| РегистрСведений.ЦеныРеализации КАК ЦеныРеализации
|ГДЕ
| ЦеныРеализации.Регистратор = &Регистратор
|УПОРЯДОЧИТЬ ПО
| ЦеныРеализации.НомерСтроки";
Запрос.УстановитьПараметр("Регистратор",СсылкаДок);
РезультатЗапроса = Запрос.Выполнить();
Записи = РезультатЗапроса.Выбрать();
Пока Записи.Следующий() Цикл
Сообщить("по документу " + Записи.Регистратор + " по " +Записи.Организация + ", "
+ Записи.Контрагент + " " + Записи.Номенклатура +" = "+ Записи.Цена + " руб.");
КонецЦикла;
КонецПроцедуры
Процедура ЧтениеЗаписиЗапросом()
// Если не требуется изменять найденные записи.
СсылкаДок = Документы.УстановкаЦен.НайтиПоНомеру("ПТО-00000001", '20201231');
// Чтение запросом записей регистра сведений "ЦеныРеализации" текущего документа
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЦеныРеализации.Период,
| ЦеныРеализации.Регистратор,
| ЦеныРеализации.НомерСтроки,
| ЦеныРеализации.Активность,
| ЦеныРеализации.Номенклатура,
| ЦеныРеализации.Контрагент,
| ЦеныРеализации.Организация,
| ЦеныРеализации.Цена
|ИЗ
| РегистрСведений.ЦеныРеализации КАК ЦеныРеализации
|ГДЕ
| ЦеныРеализации.Регистратор = &Регистратор
|УПОРЯДОЧИТЬ ПО
| ЦеныРеализации.НомерСтроки";
Запрос.УстановитьПараметр("Регистратор",СсылкаДок);
РезультатЗапроса = Запрос.Выполнить();
Записи = РезультатЗапроса.Выбрать();
Пока Записи.Следующий() Цикл
Сообщить("по документу " + Записи.Регистратор + " по " +Записи.Организация + ", "
+ Записи.Контрагент + " " + Записи.Номенклатура +" = "+ Записи.Цена + " руб.");
КонецЦикла;
КонецПроцедуры
Получение наиболее ранних записей регистра сведений через срез первых на дату в 1С 8.3:
&НаСервере
Процедура ПолучениеНаиболееРаннихЗаписей()
// Параметры виртуальной таблицы СрезПервых:
// 1. Период (включительно)
// 2. Условие (например, Организация = &ВыбОрганизация)
// Получение цен на Молоко 3,2% для каждого контрагента на начало 2 квартала 2020 года (включительно)
// по организации ОАО "Гипермаркет АЗИЯ".
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЦеныРеализацииСрезПервых.Период,
| ЦеныРеализацииСрезПервых.Активность,
| ЦеныРеализацииСрезПервых.Номенклатура,
| ЦеныРеализацииСрезПервых.Контрагент,
| ЦеныРеализацииСрезПервых.Организация,
| ЦеныРеализацииСрезПервых.Цена
|ИЗ
| РегистрСведений.ЦеныРеализации.СрезПервых(
| ДАТАВРЕМЯ(2020, 04, 01, 00, 00, 00),
| Организация = &ВыбОрганизация И
| Номенклатура = &ВыбНоменклатура) КАК ЦеныРеализацииСрезПервых
|УПОРЯДОЧИТЬ ПО
| ЦеныРеализацииСрезПервых.Контрагент";
Запрос.УстановитьПараметр("ВыбОрганизация",Справочники.Организации.НайтиПоНаименованию("ОАО ""Гипермаркет АЗИЯ"""));
Запрос.УстановитьПараметр("ВыбНоменклатура",Справочники.Номенклатура.НайтиПоНаименованию("Молоко 3,2%"));
РезультатЗапроса = Запрос.Выполнить();
Записи = РезультатЗапроса.Выбрать();
Пока Записи.Следующий() Цикл
Сообщить("за " + Записи.Период + " на " +Записи.Номенклатура + " " + Записи.Контрагент + " = " +Записи.Цена + " руб.");
КонецЦикла;
КонецПроцедуры
Процедура ПолучениеНаиболееРаннихЗаписей()
// Параметры виртуальной таблицы СрезПервых:
// 1. Период (включительно)
// 2. Условие (например, Организация = &ВыбОрганизация)
// Получение цен на Молоко 3,2% для каждого контрагента на начало 2 квартала 2020 года (включительно)
// по организации ОАО "Гипермаркет АЗИЯ".
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЦеныРеализацииСрезПервых.Период,
| ЦеныРеализацииСрезПервых.Активность,
| ЦеныРеализацииСрезПервых.Номенклатура,
| ЦеныРеализацииСрезПервых.Контрагент,
| ЦеныРеализацииСрезПервых.Организация,
| ЦеныРеализацииСрезПервых.Цена
|ИЗ
| РегистрСведений.ЦеныРеализации.СрезПервых(
| ДАТАВРЕМЯ(2020, 04, 01, 00, 00, 00),
| Организация = &ВыбОрганизация И
| Номенклатура = &ВыбНоменклатура) КАК ЦеныРеализацииСрезПервых
|УПОРЯДОЧИТЬ ПО
| ЦеныРеализацииСрезПервых.Контрагент";
Запрос.УстановитьПараметр("ВыбОрганизация",Справочники.Организации.НайтиПоНаименованию("ОАО ""Гипермаркет АЗИЯ"""));
Запрос.УстановитьПараметр("ВыбНоменклатура",Справочники.Номенклатура.НайтиПоНаименованию("Молоко 3,2%"));
РезультатЗапроса = Запрос.Выполнить();
Записи = РезультатЗапроса.Выбрать();
Пока Записи.Следующий() Цикл
Сообщить("за " + Записи.Период + " на " +Записи.Номенклатура + " " + Записи.Контрагент + " = " +Записи.Цена + " руб.");
КонецЦикла;
КонецПроцедуры
Получение наиболее поздних записей регистра сведений через срез последних на дату в 1С 8.3:
&НаСервере
Процедура ПолучениеНаиболееПозднихЗаписей()
// Параметры виртуальной таблицы СрезПоследних:
// 1. Период (включительно)
// 2. Условие (например, Организация = &ВыбОрганизация)
// Получение цен на Молоко 3,2% для каждого контрагента на конец 2 квартала 2020 года (включительно)
// по организации ОАО "Гипермаркет АЗИЯ".
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЦеныРеализацииСрезПоследних.Период,
| ЦеныРеализацииСрезПоследних.Активность,
| ЦеныРеализацииСрезПоследних.Номенклатура,
| ЦеныРеализацииСрезПоследних.Контрагент,
| ЦеныРеализацииСрезПоследних.Организация,
| ЦеныРеализацииСрезПоследних.Цена
|ИЗ
| РегистрСведений.ЦеныРеализации.СрезПоследних(
| ДАТАВРЕМЯ(2020, 06, 30, 23, 59, 59),
| Организация = &ВыбОрганизация И
| Номенклатура = &ВыбНоменклатура
| ) КАК ЦеныРеализацииСрезПоследних
|УПОРЯДОЧИТЬ ПО
| ЦеныРеализацииСрезПоследних.Контрагент";
Запрос.УстановитьПараметр("ВыбОрганизация",Справочники.Организации.НайтиПоНаименованию("ОАО ""Гипермаркет АЗИЯ"""));
Запрос.УстановитьПараметр("ВыбНоменклатура",Справочники.Номенклатура.НайтиПоНаименованию("Молоко 3,2%"));
РезультатЗапроса = Запрос.Выполнить();
Записи = РезультатЗапроса.Выбрать();
Пока Записи.Следующий() Цикл
Сообщить("за " + Записи.Период + " на " +Записи.Номенклатура + " " + Записи.Контрагент + " = " +Записи.Цена + " руб.");
КонецЦикла;
КонецПроцедуры
Процедура ПолучениеНаиболееПозднихЗаписей()
// Параметры виртуальной таблицы СрезПоследних:
// 1. Период (включительно)
// 2. Условие (например, Организация = &ВыбОрганизация)
// Получение цен на Молоко 3,2% для каждого контрагента на конец 2 квартала 2020 года (включительно)
// по организации ОАО "Гипермаркет АЗИЯ".
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЦеныРеализацииСрезПоследних.Период,
| ЦеныРеализацииСрезПоследних.Активность,
| ЦеныРеализацииСрезПоследних.Номенклатура,
| ЦеныРеализацииСрезПоследних.Контрагент,
| ЦеныРеализацииСрезПоследних.Организация,
| ЦеныРеализацииСрезПоследних.Цена
|ИЗ
| РегистрСведений.ЦеныРеализации.СрезПоследних(
| ДАТАВРЕМЯ(2020, 06, 30, 23, 59, 59),
| Организация = &ВыбОрганизация И
| Номенклатура = &ВыбНоменклатура
| ) КАК ЦеныРеализацииСрезПоследних
|УПОРЯДОЧИТЬ ПО
| ЦеныРеализацииСрезПоследних.Контрагент";
Запрос.УстановитьПараметр("ВыбОрганизация",Справочники.Организации.НайтиПоНаименованию("ОАО ""Гипермаркет АЗИЯ"""));
Запрос.УстановитьПараметр("ВыбНоменклатура",Справочники.Номенклатура.НайтиПоНаименованию("Молоко 3,2%"));
РезультатЗапроса = Запрос.Выполнить();
Записи = РезультатЗапроса.Выбрать();
Пока Записи.Следующий() Цикл
Сообщить("за " + Записи.Период + " на " +Записи.Номенклатура + " " + Записи.Контрагент + " = " +Записи.Цена + " руб.");
КонецЦикла;
КонецПроцедуры
Создание записи в регистре сведений без привязки к документу в 1С 8.3:
&НаСервере
Процедура СозданиеЗаписиБезПривязкиКДокументу()
// Создание записи в регистре сведений без привязки к документу можно только для регистров,
// в свойствах которых установлен режим записи "Независимый".
// Создание записи - для единичных записей лучше использовать "Менеджер Записей"
НоваяЗапись = РегистрыСведений.КурсВалют.СоздатьМенеджерЗаписи();
НоваяЗапись.Период = '20200401';
НоваяЗапись.Валюта = Справочники.Валюты.НайтиПоНаименованию("Евро");
НоваяЗапись.Курс = 2.8010;
НоваяЗапись.Записать(Истина); // Замещение - если уже есть запись с такими же измерениями и таким же периодом
// Поиск, изменение и удаление созданной запись на дату
Выборка = РегистрыСведений.КурсВалют.Выбрать('20200401', '20200401');
Если Выборка.Следующий() Тогда
Запись = Выборка.ПолучитьМенеджерЗаписи();
Запись.Прочитать();
Запись.Курс = 2.8020;// Изменение курса Евро
Запись.Записать(Истина);// Запись курса Евро
Запись.Удалить();// Удаление курса Евро
КонецЕсли;
// Для группового изменения записей лучше использовать "Набор Записей"
Евро = Справочники.Валюты.НайтиПоНаименованию("Евро");
НаборЗаписей = РегистрыСведений.КурсВалют.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Валюта.Установить(Евро);
Запись_1 = НаборЗаписей.Добавить();
Запись_1.Период = '20200401'; // 01 апреля 2020 г.
Запись_1.Валюта = Евро;
Запись_1.Курс = 2.8446;
Запись_2 = НаборЗаписей.Добавить();
Запись_2.Период = '20200402'; // 02 апреля 2020 г.
Запись_2.Валюта = Евро;
Запись_2.Курс = 2.8478;
Запись_3 = НаборЗаписей.Добавить();
Запись_3.Период = '20200403'; // 03 апреля 2020 г.
Запись_3.Валюта = Евро;
Запись_3.Курс = 2.8320;
Запись_4 = НаборЗаписей.Добавить();
Запись_4.Период = '20200404'; // 04 апреля 2020 г.
Запись_4.Валюта = Евро;
Запись_4.Курс = 2.7943;
Запись_5 = НаборЗаписей.Добавить();
Запись_5.Период = '20200405'; // 05 апреля 2020 г.
Запись_5.Валюта = Евро;
Запись_5.Курс = 2.7797;
// Запись сразу всего набора
НаборЗаписей.Записать(Истина); // Замещение - если уже есть запись с такими же измерениями и таким же периодом
КонецПроцедуры
Процедура СозданиеЗаписиБезПривязкиКДокументу()
// Создание записи в регистре сведений без привязки к документу можно только для регистров,
// в свойствах которых установлен режим записи "Независимый".
// Создание записи - для единичных записей лучше использовать "Менеджер Записей"
НоваяЗапись = РегистрыСведений.КурсВалют.СоздатьМенеджерЗаписи();
НоваяЗапись.Период = '20200401';
НоваяЗапись.Валюта = Справочники.Валюты.НайтиПоНаименованию("Евро");
НоваяЗапись.Курс = 2.8010;
НоваяЗапись.Записать(Истина); // Замещение - если уже есть запись с такими же измерениями и таким же периодом
// Поиск, изменение и удаление созданной запись на дату
Выборка = РегистрыСведений.КурсВалют.Выбрать('20200401', '20200401');
Если Выборка.Следующий() Тогда
Запись = Выборка.ПолучитьМенеджерЗаписи();
Запись.Прочитать();
Запись.Курс = 2.8020;// Изменение курса Евро
Запись.Записать(Истина);// Запись курса Евро
Запись.Удалить();// Удаление курса Евро
КонецЕсли;
// Для группового изменения записей лучше использовать "Набор Записей"
Евро = Справочники.Валюты.НайтиПоНаименованию("Евро");
НаборЗаписей = РегистрыСведений.КурсВалют.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Валюта.Установить(Евро);
Запись_1 = НаборЗаписей.Добавить();
Запись_1.Период = '20200401'; // 01 апреля 2020 г.
Запись_1.Валюта = Евро;
Запись_1.Курс = 2.8446;
Запись_2 = НаборЗаписей.Добавить();
Запись_2.Период = '20200402'; // 02 апреля 2020 г.
Запись_2.Валюта = Евро;
Запись_2.Курс = 2.8478;
Запись_3 = НаборЗаписей.Добавить();
Запись_3.Период = '20200403'; // 03 апреля 2020 г.
Запись_3.Валюта = Евро;
Запись_3.Курс = 2.8320;
Запись_4 = НаборЗаписей.Добавить();
Запись_4.Период = '20200404'; // 04 апреля 2020 г.
Запись_4.Валюта = Евро;
Запись_4.Курс = 2.7943;
Запись_5 = НаборЗаписей.Добавить();
Запись_5.Период = '20200405'; // 05 апреля 2020 г.
Запись_5.Валюта = Евро;
Запись_5.Курс = 2.7797;
// Запись сразу всего набора
НаборЗаписей.Записать(Истина); // Замещение - если уже есть запись с такими же измерениями и таким же периодом
КонецПроцедуры
💡 Шаблоны (готовые модели) кода 1С 8.3 с тегом #Регистры сведений:
📰 Актуальные новости с тегом #Регистры сведений:
- В версии 8.3.26 разработано новое значение перечисления РежимЗамещения.Обновление в методы РегистрСведенийНаборЗаписей.<Имя регистра сведений>. Записать(<Замещение>) и РегистрНакопленийНаборЗаписей.<Имя регистра сведений>. Записать(<Замещение>). В качестве параметра Замещение может передаваться одно из значений перечисления РежимЗамещения.В перечисление РежимЗамещения к существующим элементам Добавление, Замещение, Слияние, Удаление добавляется новый элемент Обновление. В отличие от режима Слияние в режиме Обновление производится только обновление существующих записей регистра, совпадающих по значениям ключевых полей с записями набора записей. Добавление новых записей в регистр не производится, что существенно ускоряет процедуру записи. Будет полезно например при свертке остатков.
- В версии 8.3.25 предложены дополнительные режимы при записи наборов записей независимых регистров сведений. Параметр метода Записать(<Замещение>) регистра сведений может также принимать значение нового перечисления РежимЗамещения / ReplacementMode:
- Добавление / Append
- Замещение / Replace (значение параметра = Ложь функционально эквивалентно РежимЗамещения.Добавление, а значение Истина – РежимЗамещения.Замещение)
- Слияние / Merge (только для независимого регистра сведений)
- Удаление / Delete (только для независимого регистра сведений)
При записи набора записей в режимах РежимЗамещения.Слияние и РежимЗамещения.Удаление отбор лучше не устанавливать так как множество добавляемых/обновляемых/удаляемых записей регистра в этих режимах определяется исключительно записями, присутствующими в наборе записей. Но при этом все равно проверяется соответствие установленному отбору, что может привести к ошибке, если какая-либо из записей не соответствует отбору.
0
комментарии
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник