Имя: Пароль:
1C
 
Отбор в регистре сведений
0 Наташа Ф
 
19.07.06
13:42
Имеется периодический (в пределах дня), независимый регистр сведений. Я хочу записать туда набор записей с отбором по периоду. Период месяц. Делаю так:
НаборЗаписей = РегистрыСведений.ОстаткиТоваровНаСкладах.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Период.Установить();
НаборЗаписей.Отбор.Период.ЗначениеС = МинДатаО;
НаборЗаписей.Отбор.Период.ЗначениеПо = МаксДатаО;
Далее добавляю записи:
стр = НаборЗаписей.Добавить();
...
И в итоге записать набор записей не получется, на команде
НаборЗаписей.Записать(Истина);
Программа выдает ошибку, ругается на период записи.
Что не так?
1 Азат
 
19.07.06
13:43
А все просто: в 7.7 не было регистров сведений...
2 Наташа Ф
 
19.07.06
13:44
Не переставила на v8, извиняюсь.
3 Азат
 
19.07.06
13:45
А при записи устанавливаете период?
4 Азат
 
19.07.06
13:45
В смысле при заполнении записи?
5 Поток сознания
 
19.07.06
13:46
Периодический (в пределах дня) .. и .. Период месяц
А может все-таки период день в отборе выставлять?
6 ValA
 
19.07.06
13:49
так в какой из дней в (0) ты пишешь? непонимает она 8.0 тебя.
7 Наташа Ф
 
19.07.06
13:49
Да, при добавлении записи устанавливаю период - дату.
Мне нужно добавить сразу за месяц записи добавить. Это невозможно? Надо на каждый день отбор выставлять? Зачем в таком случае там в отборе по периоду ЗаначениеС и ЗначениеПО ?
8 Черноморетс
 
19.07.06
13:50
там еще тип периода есть какой то
9 Наташа Ф
 
19.07.06
13:51
(6) Пишу первую запись период 01.06.2006, вторую запись период 02.06.2006 и т. д., последняя запись 30.06.2006.
10 Черноморетс
 
19.07.06
13:54
а ошибку точно какую выдает?
11 Наташа Ф
 
19.07.06
13:55
(8) Тип периода? Это где? Сейчас в отладчике смотрела - есть НаборЗаписей.Отбор.Период.ТипЗначения, тип Описание типов, значение Дата. По моему не то...
12 Наташа Ф
 
19.07.06
13:56
(10) Ошибка:
{Форма.Форма(371)}: Ошибка при вызове метода контекста (Записать): Запись не верна! : Уфа : УФА:Уршак : Арматура А-III 10 : Арматура А-III 10 :  : 01.06.2006 0:00:00 (Регистр сведений: Остатки товаров на складах; Номер строки: 1; Поле: Период)
    НаборЗаписей.Записать(Истина);
по причине:
Запись не верна! : Уфа : УФА:Уршак : Арматура А-III 10 : Арматура А-III 10 :  : 01.06.2006 0:00:00 (Регистр сведений: Остатки товаров на складах; Номер строки: 1; Поле: Период)
13 Черноморетс
 
19.07.06
13:57
(11) нет, не слушай меня, бес попутал, апельсин в голову ударил
14 Defender aka LINN
 
19.07.06
14:00
(12) НаборЗаписей.Прочтитать() делала?
Может уже есть запись с таким периодом?
15 Черноморетс
 
19.07.06
14:02
(14) вроед она в этом случае как то по другому матерится, но Прочитать() полюбому стоит
16 Наташа Ф
 
19.07.06
14:05
(14) Делала Прочитать:
НаборЗаписей = РегистрыСведений.ОстаткиТоваровНаСкладах.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Период.Установить();
НаборЗаписей.Отбор.Период.ЗначениеС = МинДатаО;
НаборЗаписей.Отбор.Период.ЗначениеПо = МаксДатаО;
НаборЗаписей.Прочитать();
Та же ошибка. Записей за эти даты нет.
Ошибки нет если я устанавливаю Период в отборе - 1 день. И пишу записи только за этот день. Но мне-то надо месяц сразу!
17 Черноморетс
 
19.07.06
14:09
а весь код дай позырить
18 ValA
 
19.07.06
14:11
ЭлементОтбора (FilterItem)
Установить (Set)
Синтаксис:
Установить(<Значение>, <Использование>)
Параметры:
<Значение> (необязательный)
Тип: Произвольный. Значение сравнения.
<Использование> (необязательный)
Тип: Булево. Признак использования отбора по значению.
Значение по умолчанию: Истина
Описание:
Устанавливает значение отбора и флаг использования. При выполнении данного метода вид сравнения устанавливается в значение Равно.
Примечание:
Метод имеет смысл применять, если необходимо установить и значение и использование отбора.
Пример:
СписокКурсыВалют.Отбор.Валюта.Установить(Ссылка);

по моему, у тебя неправильный отбор, если используешь установить то нужно указать что устанавливаешь, если нужен период, то указывать нужно вид сравнения
19 Черноморетс
 
19.07.06
14:12
ВО, вид сравнения я имел в виду в (8)
20 Наташа Ф
 
19.07.06
14:23
(17) Код длинный.
(18) Без Установить вообще Отбор не включался, ошибки не было но в регистре все перезаписывалось, и за другие месяцы тоже. Пыталась присвоить свойству Использование значение Истина:
НаборЗаписей.Отбор.Период.Использование = Истина
но почему-то не срабатывало хоть и не ругалось.
(19) Попробую.
21 ValA
 
19.07.06
14:25
перезаписалось все потому что отбор не был установлен
22 Наташа Ф
 
19.07.06
14:29
(19) Эх, не получается с видом сравнения. Выдает:
{Форма.Форма(87)}: Ошибка при установке значения атрибута контекста (ВидСравнения): Недопустимый тип сравнения
            НаборЗаписей.Отбор.Период.ВидСравнения =  ВидСравнения.Интервал;
по причине:
Недопустимый тип сравнения
Там похоже только равенство можно...
23 ValA
 
19.07.06
14:31
делай через запрос
24 Наташа Ф
 
19.07.06
14:38
(23) А через запрос я смогу записать набор записей?
25 ValA
 
19.07.06
14:39
нет, получишь нужные записи, поменяешь, потом запишешь
26 Наташа Ф
 
19.07.06
14:41
Поняла, спасибо.
27 Радио
 
19.07.06
14:42
проще, только выборкой
28 Черноморетс
 
19.07.06
14:52
дала бы код, интересно же
29 Наташа Ф
 
19.07.06
15:03
(28) Если так интересно то вот :)
Перем МинДата;
Перем МаксДата;
Перем МинДатаО;
Перем МаксДатаО;
Перем тзТемп;
Перем тзПараметры;
Перем тзКарточки;
Перем спПроизводители;
Перем спСклады;
Перем спрПарам;
Перем ДиалогВыбораФайла;
Перем Филиал;
Перем НаборЗаписей;

Процедура КнопкаВыполнитьНажатие(Кнопка)
   Первый = Истина;
   КоличествоНовых = 0;
   КоличествоНовыхСкладов = 0;
   КоличествоНовыхПроизволителей = 0;
   спПроизводители  = Новый ТаблицаЗначений;
   спПроизводители.Колонки.Добавить("Филиал", Новый ОписаниеТипов("СправочникСсылка.Филиалы"));
   спПроизводители.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
   спПроизводители.Колонки.Добавить("СсылкаН", Новый ОписаниеТипов("СправочникСсылка.Производители"));
   
   
   спСклады = Новый ТаблицаЗначений;
   спСклады.Колонки.Добавить("Филиал", Новый ОписаниеТипов("СправочникСсылка.Филиалы"));
   спСклады.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
   спСклады.Колонки.Добавить("СсылкаН", Новый ОписаниеТипов("СправочникСсылка.Склады"));
   
   спрПарам = Справочники.ПараметрыНоменклатуры;
   спрКарт = Справочники.Карточки;
   
   тзПараметры = Новый ТаблицаЗначений;
   тзПараметры.Колонки.Добавить("Филиал", Новый ОписаниеТипов("СправочникСсылка.Филиалы"));
   тзПараметры.Колонки.Добавить("Владелец", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
   тзПараметры.Колонки.Добавить("Производитель", Новый ОписаниеТипов("Строка"));
   тзПараметры.Колонки.Добавить("ГОСТСортамент", Новый ОписаниеТипов("СправочникСсылка.ГОСТы"));
   тзПараметры.Колонки.Добавить("ГОСТПродукция", Новый ОписаниеТипов("СправочникСсылка.ГОСТы"));
   тзПараметры.Колонки.Добавить("МаркаСтали", Новый ОписаниеТипов("СправочникСсылка.МаркиСтали"));
   тзПараметры.Колонки.Добавить("Доп1", Новый ОписаниеТипов("Строка"));
   тзПараметры.Колонки.Добавить("Доп2", Новый ОписаниеТипов("Строка"));
   тзПараметры.Колонки.Добавить("Доп3", Новый ОписаниеТипов("Строка"));
   тзПараметры.Колонки.Добавить("Р1", Новый ОписаниеТипов("Строка"));
   тзПараметры.Колонки.Добавить("Р2", Новый ОписаниеТипов("Строка"));
   тзПараметры.Колонки.Добавить("Р3", Новый ОписаниеТипов("Строка"));
   тзПараметры.Колонки.Добавить("Примечание", Новый ОписаниеТипов("Строка"));
   тзПараметры.Колонки.Добавить("СсылкаН", Новый ОписаниеТипов("СправочникСсылка.ПараметрыНоменклатуры"));
   КоличествоНовыхНаборов = 0;
   НайденныеФайлы = НайтиФайлы(ИмяФайла,"*.dbf");
   Для Каждого  ВыбФайл Из НайденныеФайлы Цикл
       
       Если СтрДлина(ВыбФайл.ПолноеИмя) = 0 Тогда
           Возврат;
       Конецесли;
       
       
       ДБ = Новый xBase(СокрЛП(ВыбФайл.ПолноеИмя),,Истина);
       
       ДБ.Первая();
       ФилиалН =  ДБ.ПолучитьЗначениеПоля("Fil");
       Сообщить(ФилиалН);
       Филиал = Справочники.Филиалы.НайтиПоНаименованию(СокрЛП(ФилиалН));
       Если Филиал.Пустая() Тогда
           Сообщить("Не найден филиал "+ФилиалН);
           Возврат;
       КонецЕсли;    
       
       МинДата = ДБ.ПолучитьЗначениеПоля("Date");
       ДБ.Последняя();
       МаксДата = ДБ.ПолучитьЗначениеПоля("Date");
       Если Первый Тогда
           МинДатаО = МинДата;
           МаксДатаО = МаксДата;
       ИначеЕсли (МинДатаО <> МинДата) ИЛИ (МаксДатаО <> МаксДата) Тогда
           Сообщить("Интервал дат филиала "+ФилиалН+" "+МинДата+" - "+МаксДата+" отличается от общего "+МинДатаО+" - "+МаксДатаО);
       КонецЕсли;    
       
       Если Первый Тогда
            НаборЗаписей = РегистрыСведений.ОстаткиТоваровНаСкладах.СоздатьНаборЗаписей();
            НаборЗаписей.Отбор.Период.Установить();
            НаборЗаписей.Отбор.Период.ЗначениеС = МинДатаО;
            НаборЗаписей.Отбор.Период.ЗначениеПо = МаксДатаО;
            НаборЗаписей.Отбор.Период.ВидСравнения =  ВидСравнения.Интервал;
            НаборЗаписей.Прочитать();
            НаборЗаписей.Очистить();
            НаборЗаписей.Записать();
       КонецЕсли;    
       ДБ.Первая();
       Н = 1; Шаг = ДБ.КоличествоЗаписей()/100;
       Пока 1 = 1 Цикл
           ОбработкаПрерыванияПользователя();
           
           День = Дата(ДБ.ПолучитьЗначениеПоля(0));
           Сумма = ДБ.ПолучитьЗначениеПоля(1);
           Элемент = Справочники.Номенклатура.НайтиПоКоду(ДБ.ПолучитьЗначениеПоля(2));
           Сталь = Справочники.МаркиСтали.НайтиПоНаименованию(ДБ.ПолучитьЗначениеПоля(3));
           Производитель = ДБ.ПолучитьЗначениеПоля(4);
           ГОСТСортамент = Справочники.ГОСТы.НайтиПоНаименованию(ДБ.ПолучитьЗначениеПоля(5));
           ГОСТПродукция = Справочники.ГОСТы.НайтиПоНаименованию(ДБ.ПолучитьЗначениеПоля(6));
           Р1 = ДБ.ПолучитьЗначениеПоля(7);
           Р2 = ДБ.ПолучитьЗначениеПоля(8);
           Р3 = ДБ.ПолучитьЗначениеПоля(9);
           Доп1 = ДБ.ПолучитьЗначениеПоля(10);
           Доп2 = ДБ.ПолучитьЗначениеПоля(11);
           Доп3 = ДБ.ПолучитьЗначениеПоля(12);
           Примечание = ДБ.ПолучитьЗначениеПоля(13);
           Склад = ДБ.ПолучитьЗначениеПоля(14);
           
           Количество = Число(ДБ.ПолучитьЗначениеПоля(15));
           
           
           Производитель1 = Справочники.Производители.НайтиПоНаименованию(СокрЛП(Производитель),Истина);
           Если Производитель1 = Справочники.Производители.ПустаяСсылка() Тогда
               СтрП = спПроизводители.Добавить();
               СтрП.Филиал = Филиал;
               СтрП.Наименование = СокрЛП(Производитель);
               СтрП.СсылкаН = Справочники.Производители.ПолучитьСсылку();
               Производитель1 = СтрП.СсылкаН;
           Конецесли;
           
           НаименованиеСклада = ДБ.ПолучитьЗначениеПоля(14);
           Склад1 = Справочники.Склады.НайтиПоНаименованию(ВРег(СокрЛП(Филиал.Наименование))+":"+НаименованиеСклада,Истина);
           Если Склад1 = Справочники.Склады.ПустаяСсылка() Тогда
               СтрП = спСклады.Добавить();
               СтрП.Филиал = Филиал;
               СтрП.Наименование = ВРег(СокрЛП(Филиал.Наименование))+":"+НаименованиеСклада;
               СтрП.СсылкаН = Справочники.Склады.ПолучитьСсылку();
               Склад1 = СтрП.СсылкаН;
           Конецесли;
           
           // будем искать такой элемент среди параметров номенклатуры
           выборка = спрПарам.Выбрать(,Элемент); Найден = 0;
           Пока выборка.Следующий() Цикл
               Если (СокрЛП(выборка.Производитель.Наименование) = СокрЛП(Производитель)) И
                    (выборка.ГОСТСортамент = ГОСТСортамент) И
                    (выборка.ГОСТПродукция = ГОСТПродукция) И
                    (выборка.МаркаСтали = Сталь) И
                    (СокрЛП(выборка.Доп1) = СокрЛП(Доп1)) И
                    (СокрЛП(выборка.Доп2) = СокрЛП(Доп2)) И
                    (СокрЛП(выборка.Доп3) = СокрЛП(Доп3)) И
                    (СокрЛП(выборка.Р1) = СокрЛП(Р1)) И
                    (СокрЛП(выборка.Р2) = СокрЛП(Р2)) И
                    (СокрЛП(выборка.Р3) = СокрЛП(Р3)) И
                    (СокрЛП(выборка.Примечание) = СокрЛП(Примечание)) Тогда
               
               Найден = 1;
               Параметр1 = выборка.Ссылка;
                    Прервать;
                   
               КонецЕсли;
           КонецЦикла;    
           Если Найден = 0 Тогда
               стр = тзПараметры.Добавить();
               стр.Филиал = Филиал;
               стр.Владелец = Элемент;
               стр.Производитель = Производитель;
               стр.ГОСТСортамент = ГОСТСортамент;
               стр.ГОСТПродукция = ГОСТПродукция;
               стр.МаркаСтали = Сталь;
               стр.Доп1 = Доп1;
               стр.Доп2 = Доп2;
               стр.Доп3 = Доп3;
               стр.Р1 = Р1;
               стр.Р2 = Р2;
               стр.Р3 = Р3;
               стр.Примечание = Примечание;    
               стр.СсылкаН = Справочники.ПараметрыГОСТов.ПолучитьСсылку();
               Параметр1 =  стр.СсылкаН;
           КонецЕсли;
           стр = НаборЗаписей.Добавить();
           стр.Количество = Количество;
           стр.Филиал = Филиал;
           стр.Номенклатура = Элемент;
           стр.ПараметрыНоменклатуры =  Параметр1;
           стр.Период = Дата(День);
           стр.Склад = Склад1;
           стр.Сумма = Сумма;
           ЭлементыФормы.Индикатор1.Значение = Н/Шаг;
           
           Н = Н + 1;
           Если НЕ ДБ.Следующая() Тогда
               Прервать;
           КонецЕсли;
       КонецЦикла;
       
       тзПараметры.Свернуть("Филиал,Владелец,Производитель,ГОСТСортамент,ГОСТПродукция,МаркаСтали,Доп1,Доп2,Доп3,Р1,Р2,Р3,Примечание,СсылкаН","");
       КоличествоНовыхНаборов = тзПараметры.Количество();
       спСклады.Свернуть("Филиал,Наименование,СсылкаН","");
       спПроизводители.Свернуть("Филиал,Наименование,СсылкаН","");
       КоличествоНовыхСкладов = спСклады.Количество();
       КоличествоНовыхПроизводителей = спПроизводители.Количество();
       
       Если Первый Тогда
       ЭлементыФормы.НадписьПериод.Заголовок = ""+МинДата+" - "+МаксДата;
       Первый = Ложь;
       КонецЕсли;
   КонецЦикла;
   
КонецПроцедуры

Процедура ИмяФайлаНачалоВыбора(Элемент, СтандартнаяОбработка)
   ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
   Если ДиалогВыбораФайла.Выбрать() Тогда
       ИмяФайла = ДиалогВыбораФайла.Каталог;
   Конецесли;
   
КонецПроцедуры

Процедура ОсновныеДействияФормыЗаписать(Кнопка)
   
   // сначала запишем новые наборы параметров
   
   // сначала запишем склады
   Для Каждого эс Из спСклады Цикл
       НовПроиз = Справочники.Склады.СоздатьЭлемент();
       НовПроиз.УстановитьСсылкуНового(эс.СсылкаН);        
       НовПроиз.Наименование = ВРег(СокрЛП(эс.Филиал.Наименование))+":"+СокрЛП(эс.Наименование);
       НовПроиз.Записать();
       КоличествоНовыхСкладов = КоличествоНовыхСкладов - 1;
       Сообщить("добавлен склад <"+СокрЛП(эс)+">",СтатусСообщения.Информация);
   КонецЦикла;
   спПроизводители.Свернуть("Наименование,СсылкаН","");
   // сначала запишем производителей
   Для Каждого эс Из спПроизводители Цикл
       НовПроиз = Справочники.Производители.СоздатьЭлемент();
       НовПроиз.УстановитьСсылкуНового(эс.СсылкаН);        
       НовПроиз.Наименование = СокрЛП(эс.Наименование);
       НовПроиз.Записать();
       КоличествоНовыхПроизводителей = КоличествоНовыхПроизводителей - 1;
       Сообщить("добавлен производитель <"+СокрЛП(эс)+">",СтатусСообщения.Информация);
   КонецЦикла;
   
   // сначала запишем новые наборы параметров
   Для Каждого стр Из тзПараметры Цикл
       НовСпр = спрПарам.СоздатьЭлемент();
       НовСпр.УстановитьСсылкуНового(стр.СсылкаН);        
       НовСпр.Владелец = стр.Владелец;
       НовСпр.Производитель = Справочники.Производители.НайтиПоНаименованию(стр.Производитель,Истина);
       НовСпр.ГОСТСортамент = стр.ГОСТСортамент;
       НовСпр.ГОСТПродукция = стр.ГОСТПродукция;
       НовСпр.МаркаСтали = стр.МаркаСтали;
       НовСпр.Наименование = стр.Владелец.Наименование;
       НовСпр.Доп1 = стр.Доп1;
       НовСпр.Доп2 = стр.Доп2;
       НовСпр.Доп3 = стр.Доп3;
       НовСпр.Р1 = стр.Р1;
       НовСпр.Р2 = стр.Р2;
       НовСпр.Р3 = стр.Р3;
       НовСпр.Примечание = стр.Примечание;
       КоличествоНовыхНаборов = КоличествоНовыхНаборов - 1;
       Попытка
           НовСпр.Записать();
           Сообщить(""+стр.Владелец+" "+стр.МаркаСтали+" "+СокрЛП(стр.ГОСТСортамент)+" "+СокрЛП(стр.ГОСТПродукция));
       Исключение
           Сообщить("Не удалось записать новый элемент справочника:" + Символы.ПС + ОписаниеОшибки());
       КонецПопытки;
   КонецЦикла;
    НаборЗаписей.Записать(Истина);
   
   
   Предупреждение("Запись завершена!");
   Сигнал();
   
   
КонецПроцедуры

В общем холдинг - 24 филиала. Учет на 7.7. 8.0 используется для консолидированной отчетности. Из 7.7 выкачиваются данные по остаткам на каждый день в dbf файлы, все файлы складываюся в 1 каталог. Обрабока в в 8.0, в ней 2 кнопки основных - Загрузить и Записать. При нажатии Загрузить загружаются остатки в регистр сведений по остакам, по кнопке Записать все это записывается. Пользователю важно увидеть какие новые появились скажем производители, только после этого принимается решение записывать все это или нет. Поэтому процедуры загрузки и записи разнесены.
30 Черноморетс
 
19.07.06
15:35
А в отладчике НаборЗаписей полноценно выглядит?
31 Наташа Ф
 
19.07.06
16:50
(20) Вполне :)
32 Neco
 
19.07.06
16:59
Из Габец и Гончаров "Простые примеры разработки"
"Как добавить запись в периодический независимый регистр сведений?

НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();

НаборЗаписей.Отбор.Валюта.Установить(ТекущаяВалюта);
НаборЗаписей.Отбор.Период.Установить(ТекущаяДата);

НовЗапись = НаборЗаписей.Добавить();
НовЗапись.Валюта = ТекущаяВалюта;
НовЗапись.Период = ТекущаяДата;
НовЗапись.Курс = ТекущийКурс;
НовЗапись.Кратность = ТекущаяКратность;

НаборЗаписей.Записать(Истина);

Как удалить записи в периодическом независимом регистре сведений?

НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
НаборЗаписей.Записать();
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс