Имя: Пароль:
1C
1С v8
Запись в регистр сведений
0 vladimirpetrov11
 
05.12.12
13:27
Здравствуйте! Подскажите как найти определенную запись в регистре сведений, подчиненном регистратору. Регистр сведений содержит объекты: Справочник.ЛицевыеСчета. У каждого лицевого есть уникальный код, по которому нужно его найти в регистре, чтобы вбить в свойство: "Общая площадь" значение площади.
Вот картинки, чтобы поняли какой регистр:
http://s47.radikal.ru/i118/1212/ac/38bd3259c73c.jpg
на этой картинке видно, что по нескольким лицевым площади вбиты:
http://s40.radikal.ru/i089/1212/91/0b83cbbfae85.jpg

Данные о площадях лицевых будут загружаться из файла ексель с полями: Код лицевого, Общая площадь ЛС.
1 Error pro
 
05.12.12
13:29
(0) Тебе программно или интерактивно?
Отбор.Регистратор.Установить(Ссылка)
2 Wobland
 
05.12.12
13:31
запрос уже предлагали?
3 Alexey_AA
 
05.12.12
13:31
вот недавно подобную задачку делал
ВыборкаКонтЛ = РегистрыСведений.КонтактнаяИнформация.Выбрать(Новый Структура("Объект", док.КонтактноеЛицо));
       ТЗконтИнф=новый ТаблицаЗначений;
       ТЗконтИнф.Колонки.Добавить("Вид");
       ТЗконтИнф.Колонки.Добавить("Представление");
       
       //выбираем все контакты в ТЗ
       Пока ВыборкаКонтЛ.Следующий() Цикл
           НоваяСтрока=ТЗконтИнф.Добавить();
           НоваяСтрока[0]=ВыборкаКонтЛ.Вид;
           НоваяСтрока[1]=ВыборкаКонтЛ.Представление;
       КонецЦикла;
4 vladimirpetrov11
 
05.12.12
13:38
(1)Мне примеры кодов бы с решением аналогичных задач поболее, вот как Алексей кинул(3) Спасибо.

Скиньте ещё пожалуйста, кто сталкивался. Интересует только работа с регистром: поиск по объекту (коду объекта) и запись значения.
5 Alexey_AA
 
05.12.12
13:44
не за что!;)

       если ТЗконтИнф.Количество()=0 тогда
           //сообщить("инфы по данному контакту нету");
           //добавить номер договора
           если не ячНомерДог="" тогда
               НаборКонтактнойИнформации=РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
               НоваяЗапись= НаборКонтактнойИнформации.Добавить();
               НоваяЗапись.Объект=док.КонтактноеЛицо;
               НоваяЗапись.Тип    = Перечисления.ТипыКонтактнойИнформации.Другое;
               НоваяЗапись.Вид =  Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Абонентский договор 1",истина);
               НоваяЗапись.Представление  = ячНомерДог;  
               НаборКонтактнойИнформации.Записать(ложь);
           КонецЕсли;
           //добавить номер карты
6 Alexey_AA
 
05.12.12
13:46
загружал инфу из экселя в документы и регистры. если интересно скину всю обработку на почту, там просто текста куча и в принципе на тот момент я не умел пользоваться запросами, но обрабатывает 500 записей экселя она за одну минуту
7 Cunni
 
05.12.12
13:48
(6) есть типовая с диска ИТС)
8 vladimirpetrov11
 
05.12.12
13:50
(6) у меня в екселе более 16000 записей))  Если не сложно скинь на почту: [email protected]     Или может скайп есть?
9 vladimirpetrov11
 
05.12.12
13:52
(6) В 1с 7.7 написал кучу обработок. И по загрузке из экселя в справочнике в том числе (тоже могу скинуть если вдруг нужно будет). А вот в 8-ке не бум-бум. Буду разбираться сидеть...
10 Alexey_AA
 
05.12.12
13:59
(9) да я сам воттолько начал свой путь, когда-то давно учился на 7.7, но в тот момент не мог себе позволитьработу сменить. скинул на почту
11 hhhh
 
05.12.12
14:01
(8) 16000 это на уровне детского сада размер. Вот если бы 16 млн. - вот тогда надо начинать переживать.
12 samozvanec
 
05.12.12
14:06
(3)         НоваяСтрока=ТЗконтИнф.Добавить();
           НоваяСтрока[0]=ВыборкаКонтЛ.Вид;
           НоваяСтрока[1]=ВыборкаКонтЛ.Представление;

и че, работает?
13 Alexey_AA
 
05.12.12
14:09
(12) еще как работает!
14 vladimirpetrov11
 
05.12.12
14:10
(9) Спасибо!
(11) Успокоил))))
15 samozvanec
 
05.12.12
14:17
(13) по индексу только чтение для строки ТЗ
16 Alexey_AA
 
05.12.12
14:23
(15) у меня работает!

СтрокаТаблицыЗначений (ValueTableRow)
СтрокаТаблицыЗначений (ValueTableRow)
Элементы коллекции:

Произвольный
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются значения в колонке данной строки.
Возможно обращение к значению колонки данной строки посредством оператора [...]. В качестве аргумента передается индекс колонки (нумерация с 0).
17 Alexey_AA
 
05.12.12
14:26
(15) ушел проверять? :)
18 vladimirpetrov11
 
06.12.12
10:11
Продолжение... (я до сих пор бьюсь)
Подскажите как правильно произвести запись в регистр (подчинен регистратору):
Делаю так:    Для Строчка=1 по КоличествоСтрок цикл
       Если НЕ Спр.НайтиПоКоду(СокрЛП(Ексель.Cells(Строчка,1).Text))=Спр.ПустаяСсылка() тогда
           Получилось=Спр.НайтиПоКоду(СокрЛП(Ексель.Cells(Строчка,1).Text));
           НаборЗаписей=РегистрыСведений.ркЗначенияПериодическихСвойствОбъектов.СоздатьНаборЗаписей();
           //НаборЗаписей.Отбор.Регистратор.
           НоваяЗапись=НаборЗаписей.Добавить();
           НоваяЗапись.Объект=Получилось;
           НоваяЗапись.Период=ТекущаяДата();
           НоваяЗапись.Активность=Истина;
           НоваяЗапись.Значение=СокрЛП(Ексель.Cells(Строчка,9).Text);
           НоваяЗапись.Свойство=ПланыВидовХарактеристик.ркДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Общая площадь лицевого счета");
           Попытка
               НаборЗаписей.Записать();
           Исключение
               Сообщить(ОписаниеОшибки()+"ЛС: "+Получилось);
           КонецПопытки;    
       Иначе
           Сообщить("Код: "+СокрЛП(Ексель.Cells(Строчка,1).Text)+ " не найден!");
       КонецЕсли;
   КонецЦикла;
Не записывает
19 hhhh
 
06.12.12
10:25
(18) зачем два раза искать по коду одно и то же? Время сервера девать некуда?
20 vladimirpetrov11
 
06.12.12
10:26
(19)Да это мелочи, потом исправим.. Ошибку вот такую выдает:

{Форма.Форма.Форма(33)}: Ошибка при вызове метода контекста (Записать): Ошибка записи! Не установлен отбор по регистратору (Регистр сведений: Значения периодических свойств объектов)ЛС: ГУРЬЯНОВ СЕРГЕЙ АЛЕКСАНДРОВИЧ
21 vladimirpetrov11
 
06.12.12
10:28
Вот так сделал, но неверно:
           НаборЗаписей.Отбор.Регистратор.Установить("ркИзменениеСвойствЗначенийОбъектов");

Как же отобрать правильно?
22 Reset
 
06.12.12
10:31
(21) см (1)
23 hhhh
 
06.12.12
10:31
НаборЗаписей.Отбор.Регистратор.Установить("ркИзменениеСвойствЗначенийОбъектов");

тут не строка должна быть а ссылка на ваш документ регистратор.

НаборЗаписей.Отбор.Регистратор.Установить(Регистратор);

и потом тоже

       НоваяЗапись.Регистратор=Регистратор;
24 vladimirpetrov11
 
06.12.12
10:33
(22), (23) вроде дошло. Сейчас попробую. Спасибо!
25 vladimirpetrov11
 
06.12.12
10:55
Для Строчка=1 по КоличествоСтрок цикл
           ЛС=Спр.НайтиПоКоду(СокрЛП(Ексель.Cells(Строчка,1).Text));
       Если НЕ ЛС=Спр.ПустаяСсылка() тогда
           НаборЗаписей=РегистрыСведений.ркЗначенияПериодическихСвойствОбъектов.СоздатьНаборЗаписей();
           НаборЗаписей.Отбор.Регистратор.Установить(Документы.ркИзменениеЗначенийСвойствОбъектов);
           НоваяЗапись=НаборЗаписей.Добавить();
           //НоваяЗапись.Регистратор=Документы.ркИзменениеЗначенийСвойствОбъектов;
           НоваяЗапись.Объект=ЛС;
           НоваяЗапись.Период=ТекущаяДата();
           НоваяЗапись.Активность=Истина;
           НоваяЗапись.Значение=СокрЛП(Ексель.Cells(Строчка,9).Text);
           НоваяЗапись.Свойство=ПланыВидовХарактеристик.ркДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Общая площадь лицевого счета");
           Попытка
               НаборЗаписей.Записать();
           Исключение
               Сообщить(ОписаниеОшибки()+"ЛС: "+ЛС);
           КонецПопытки;    
       Иначе
           Сообщить("Код: "+СокрЛП(Ексель.Cells(Строчка,1).Text)+ " не найден!");
       КонецЕсли;
КонецЦикла;


Такая же ошибка выходит
26 vladimirpetrov11
 
06.12.12
11:02
Видимо я неправильно ссылку задал. Подскажите нубу, как надо.
27 Reset
 
06.12.12
11:05
Должен быть документ, который будет являться регистратором для записей в регистре. Указывать нужно ссылку на него.
28 Reset
 
06.12.12
11:06
Конкретный, подчерну, документ. А не произвольная фигня, которую ты пытаешься туда пихать.
29 Reset
 
06.12.12
11:06
подчеркну*
30 Reset
 
06.12.12
11:13
Наверняка же есть документ, предназнченный для заполнения регистра. Вот его нужно заполнять и проводить, а не напрямую в р-р писать.
31 vladimirpetrov11
 
06.12.12
11:23
(28)Ну вот этот документ: "Документы.ркИзменениеЗначенийСвойствОбъектов" и является регистратором
32 vladimirpetrov11
 
06.12.12
11:26
(30) т.е. нужно сначала заполнить сам документ регистратор? Есть пример, чтобы я не доставал тупыми вопросами??
33 vladimirpetrov11
 
06.12.12
11:46
Весь нет облазил но ничего нет кроме этого примера:


НаборЗаписей = РегистрыСведений.ЛимитыВозвратнойТары.СоздатьНаборЗаписей();

НаборЗаписей.Отбор.Регистратор.Установить(ВыбранныйРегистратор);

НоваяЗапись = НаборЗаписей.Добавить();

НоваяЗапись.Период = ВыбранныйРегистратор.Дата;
НоваяЗапись.Номенклатура = ВыбраннаяНоменклатура;
НоваяЗапись.ДоговорКонтрагента = ВыбранныйДоговор;
НоваяЗапись.ЛимитПоставщика = 50;

НаборЗаписей.Записать();
34 hhhh
 
06.12.12
12:11
НовыйДОк = Документы.ркИзменениеЗначенийСвойствОбъектов.СоздатьДокумент();
НовыйДок.Дата = ТекущаяДата();

НовыйДок.Записать();

ВыбранныйРегистратор = НовыйДок.Ссылка;
35 vladimirpetrov11
 
06.12.12
12:16
(34)Ясно. Спасибо! А я ограничился просто созданием, даже не записал док...мда
36 vladimirpetrov11
 
07.12.12
13:42
Вообщем все ништяк, протестировал со всех сторон. Решил на серваке запустить и опа! Операция с екселем вообще не проходит. Почему так???  
Вот ВЕСЬ код обработки:

Перем Ексель,КоличествоСтрок;

Функция ПроверкаExcel()
   Попытка
       Ексель=Новый COMОбъект("Excel.Application");  // устанавливаем связь с выбранным файлом
       Ексель.Workbooks.Open(СсылкаНаExcel);    
       Ексель.ScreenUpdating = 0;  //для ускорения
       Ексель.EnableEvents = 0; //не нужны нам "левые" предупреждения...
       Ексель.Visible = 0; //да и видеть все это не надо :)  
       КоличествоСтрок= Ексель.ActiveSheet.UsedRange.Rows.Count;     //количество строк с записями в выбранном файле
       КоличествоСтолбцов = Ексель.ActiveSheet.UsedRange.Columns.Count;      
       К=1;    
       Спр=Справочники.ркЛицевыеСчета;
   Исключение
       Сообщить("Проверьте правильность выбора файла для загрузки!");    
       Возврат ложь;
   КонецПопытки;
   
   Попытка    
       НужнаяДата=КонецМесяца(ПараметрыСеанса.ркДатаТекущегоРасчетногоПериода);//НачалоГода(ТекущаяДата());
       Док=Документы.ркИзменениеЗначенийСвойствОбъектов.СоздатьДокумент();
       Док.Дата=НужнаяДата;
       Док.Записать();
       НаборЗаписей=РегистрыСведений.ркЗначенияПериодическихСвойствОбъектов.СоздатьНаборЗаписей();
       ВыбранныйРегистратор=Док.Ссылка;
       НаборЗаписей.Отбор.Регистратор.Установить(ВыбранныйРегистратор);
       
       Для Строчка=1 по КоличествоСтрок цикл
           Если СтрДлина(СокрЛП(Ексель.Cells(Строчка,1).Text))<6 тогда
               ЛС=Спр.НайтиПоКоду(СокрЛП(Ексель.Cells(Строчка,1).Text));
               Если НЕ ЛС=Спр.ПустаяСсылка() тогда
                   НоваяСтрока= Док.Состав.Добавить();
                   // Заполнить значения реквизитов.
                   НоваяСтрока.НачалоДействия=НужнаяДата;
                   НоваяСтрока.Значение = Число(СокрЛП(Ексель.Cells(Строчка,9).Text));
                   НоваяСтрока.Объект=ЛС;
                   НоваяСтрока.Свойство=ПланыВидовХарактеристик.ркДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Общая площадь лицевого счета");
                   НоваяЗапись=НаборЗаписей.Добавить();
                   НоваяЗапись.Объект=ЛС;
                   НоваяЗапись.Период = ВыбранныйРегистратор.Дата;
                   НоваяЗапись.Активность=Истина;
                   НоваяЗапись.Значение=Число(СокрЛП(Ексель.Cells(Строчка,9).Text));
                   НоваяЗапись.Свойство=ПланыВидовХарактеристик.ркДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Общая площадь лицевого счета");
                   К=К+1;
               Иначе
                   Сообщить("Код: "+СокрЛП(Ексель.Cells(Строчка,1).Text)+ " не найден!");
               КонецЕсли;
           КонецЕсли;
       КонецЦикла;
       Попытка
           НаборЗаписей.Записать();
       Исключение
           Сообщить(ОписаниеОшибки()+"ЛС: "+ЛС);
       КонецПопытки;    
       
       Попытка
           Док.Записать();
       Исключение
           Сообщить(ОписаниеОшибки()+"ЛС: "+ЛС);
       КонецПопытки;
       Ексель.ActiveWorkBook.Close(); //закрываем Excel
       Возврат К;
   Исключение
       Сообщить(ОписаниеОшибки());
   КонецПопытки;
КонецФункции

&НаКлиенте
Процедура Загрузить(Команда)
   Если не ЗначениеЗаполнено(СсылкаНаExcel) тогда    
       Сообщить("Выберите путь к файлу Excel");
   Иначе
       Результат=ПроверкаExcel();
       Если НЕ Результат=Ложь тогда
           Сообщить("Всего записано ЛС: "+Результат);
       КонецЕсли;
   КонецЕсли;      
КонецПроцедуры

&НаКлиенте
Процедура Выбрать(Команда)
   Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
   Диалог.Заголовок = "Выберите файл";
   Диалог.ПолноеИмяФайла = "";
   Фильтр = "Excel2003(*.xls)|*.xls|Excel2007(*.xlsx)|*.xlsx";
   Диалог.Фильтр = Фильтр;
   Если Диалог.Выбрать() Тогда
       Попытка
           СсылкаНаExcel= Строка(Диалог.ПолноеИмяФайла);
       Исключение
           Сообщить(ОписаниеОшибки());
       КонецПопытки;        
   КонецЕсли;
КонецПроцедуры
37 vladimirpetrov11
 
07.12.12
13:55
Не был ексель установлен на сервере, установил. Но та же ошибка
38 Reset
 
07.12.12
13:57
Удаляй эксель, все равно ведь не помогло - ошибка та же.
39 vladimirpetrov11
 
07.12.12
13:58
(38) а если без шуток?
40 Reset
 
07.12.12
13:59
Я к тому, что называть ошибку - хороший тон.
Понятно, что локальный файл не находит, но зачем это в секрете держать?
41 zladenuw
 
07.12.12
14:00
(40) та да
42 Reset
 
07.12.12
14:00
Шутки у тебя в комментариях...
43 vladimirpetrov11
 
07.12.12
14:01
{Форма.Форма.Форма(6)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft Excel): Метод Open из класса Workbooks завершен неверно

Вот такая ошибка
44 vladimirpetrov11
 
07.12.12
14:02
Файл на сервере
45 Reset
 
07.12.12
14:03
Относительный путь к файлу, возможно, разный
46 vladimirpetrov11
 
07.12.12
14:04
(42)Ну да, тупой. Ну что сделаешь. разьясните подробнее
(45) как поправить эту ситуацию?
47 vladimirpetrov11
 
07.12.12
14:05
Куда файл поместить, чтобы считал нормально?
48 Reset
 
07.12.12
14:08
Сначала выяснить, действительно ли дело в этом. Если так, то формировать такое имя, чтобы было валидно на сервере.
Кроме того, могут другие причины быть, недоступен файл по правам и тд
Вообще, я не адепт УП, но по моему, локальный файл передавать на сервер нужно не "ссылкой",а через хранилище
49 vladimirpetrov11
 
07.12.12
14:21
(48) Права все (работаю от администратора), имя поменял на Zagr. Та же фигня. А через хранилище как передавать, объясни пожалуйста?

PS: Хотел выгрузить базу, установить локально, обновить и загрузить обратно на сервер. Но работаю по удаленному доступу и на комп пользователя база не устанавливается, пишет, что не все данные загружены, типа лимит размера базы превышен. Ехать далеко до них, так бы копию снял и на своем компе сделал все....
Основная теорема систематики: Новые системы плодят новые проблемы.