Имя: Пароль:
1C
1С v8
Модуль не записывает данные в периодический независимый регистр сведений
0 Volhvus
 
26.07.12
12:26
Добрый день Форумчане!
Возникла маленькая проблема при доработки кода. Есть периодический независимый регистр сведений, в нем одно измерение и один ресурс. Пытаюсь в него записать данные из таблицы значений. В отладчике смотрел, набор записей соответствует тому, что нужно записать в регистр сведений, но при завершении выполнения кода изменений в регистре сведений не происходит.
Выполняется следующий код:
..............

   ТаблицаЗначений=Новый ТаблицаЗначений;
   ТаблицаЗначений.Колонки.Добавить("Проект",,"Проект");
   ТаблицаЗначений.Колонки.Добавить("Период",,"Период");
   ТаблицаЗначений.Колонки.Добавить("КоэффициентУчастия",,"КоэффициентУчастия");
   Пока УчастиеСотрудника.Следующий() Цикл
       Стр=ТаблицаЗначений.Добавить();
       Стр.Проект=УчастиеСотрудника.Проект;
       Стр.Период=УчастиеСотрудника.Период;
       Стр.КоэффициентУчастия=УчастиеСотрудника.Сумма;
   КонецЦикла;
   
   НаборЗаписей= РегистрыСведений.ВспомогательныйУчастиеВПроектах.СоздатьНаборЗаписей();
   НаборЗаписей.Загрузить(ТаблицаЗначений);                      
   НаборЗаписей.Записать();

Оное происходит даже когда я просто хочу его очистить, Выполняю код:
НаборЗаписей= РегистрыСведений.ВспомогательныйУчастиеВПроектах.СоздатьНаборЗаписей();
                       
   НаборЗаписей.Записать();
результат 0, изменений в регистре не происходит
В чем проблема понять не могу. Платформа 1С:Предприятие 8.2 (8.2.15.289). Есть у кого предположения?
1 Ненавижу 1С
 
гуру
26.07.12
12:27
может стоит отбор по периоду делать?
2 Volhvus
 
26.07.12
12:29
Пробывал, результат тот же.Но при простом удалении всех записей тоже ничего не происходит?
3 Саша80
 
26.07.12
12:54
забыл кое что
НаборЗаписей= РегистрыСведений.ВспомогательныйУчастиеВПроектах.СоздатьНаборЗаписей();
НоваяЗапись=НаборЗаписей.Добавить();
НаборЗаписей.Загрузить(ТаблицаЗначений);
НаборЗаписей.Записать();
4 Саша80
 
26.07.12
12:55
как то так
5 Саша80
 
26.07.12
12:56
или НоваяЗапись.Проект=стр.Проект и т.д.
6 Volhvus
 
26.07.12
13:16
3- Добавить() нужно если идет набор записей отдельными строками, я же загружаю сразу всю таблицу значений. Набор записей и Добавить() и Загрузить() формируется один и тот же. Вопрос в том, что полученный набор записей не записывается в регистр сведений и логическое объяснение я этому пока не могу найти, типы загружаемых данных соответствуют.
7 Саша80
 
26.07.12
13:36
НаборЗаписей= РегистрыСведений.ВспомогательныйУчастиеВПроектах.СоздатьНаборЗаписей();
 Пока УчастиеСотрудника.Следующий() Цикл
       НоваяЗапись=НаборЗаписей.Добавить();      
       НоваяЗапись.Проект=УчастиеСотрудника.Проект;
       НоваяЗапись.Период=УчастиеСотрудника.Период;
       НоваяЗапись.КоэффициентУчастия=УчастиеСотрудника.Сумма;
КонецЦикла;
НаборЗаписей.Записать();
8 Саша80
 
26.07.12
13:36
а если как то так?
9 Volhvus
 
26.07.12
13:40
Я про то что не важно каким методом сформирован набор записей, и тем что предложено через Добавить() и через Загрузить() набор записей формируется один и тот же, проблема в том что после Записать() в регистре ровным счетом ничего не меняется.
10 Саша80
 
26.07.12
13:44
хм..тогда не знаю...отбор какой может использовать
11 nvs
 
26.07.12
13:46
может все это в транзакции происходит, которая потом откатывается?
12 Саша80
 
26.07.12
13:46
НаборЗаписей= РегистрыСведений.ВспомогательныйУчастиеВПроектах.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Проект.Установить(ТекущийПроект);
НаборЗаписей.Отбор.Период.Установить(ТекущийПериод);
НаборЗаписей.Отбор.КоэффициентУчастия.Установить(ТекущийКоэффициентУчастия);
   НаборЗаписей.Загрузить(ТаблицаЗначений);                      
   НаборЗаписей.Записать();
13 Саша80
 
26.07.12
13:47
попробуй так
14 nvs
 
26.07.12
13:53
Отбор максимум на период и на измерения можно ставить
Думаю строка:
НаборЗаписей.Отбор.КоэффициентУчастия.Установить(ТекущийКоэффициентУчастия)
неправомерна поскольку КоэффициентУчастия скорее всего измерение
Установлен отбор или нет - пофигу, единственно, что если установлен отбор, то для каждого набора записей измерения и период должны быть равны тем значениям которые стоят в отборе
15 nvs
 
26.07.12
13:55
поправлюсь:
КоэффициентУчастия скорее всего ресурс
16 nvs
 
26.07.12
14:02
а как определяете, что в регистре ничего нет? (если через ТП РегистрСведенийСписок - то там может быть установлен отбор)
17 Volhvus
 
26.07.12
14:26
Определяю просто, захожу в базу и смотрю. Там остаются те записи, которые я внес руками.
18 hhhh
 
26.07.12
14:28
(17) а "обновить" там на регистре нажимали?
19 Volhvus
 
26.07.12
14:52
При открытии регистра а не переходе к нему, смысла нет его обновлять, но все равно пробывал!:)
20 Volhvus
 
26.07.12
14:55
Все тоже самое в базе, созданной с нуля работает. Значит дело не в платформе.
21 НастоящееИмя
 
26.07.12
14:56
(19) может просто данные не изменяются?
22 Volhvus
 
26.07.12
16:24
Меняются. Я сделал две записи, а записываю другие, при этом регистр должен очиститься, мне он нужен только чтобы получить срезпоследних по загружаемым в него данным.
Может быть задачу можно решить другими способами? Есть документ который делает движения в периодическом регистре сведений Измерения: Сотрудник, Проект Тип СправочникСсылка и ресурс коэффициент участия  Тип Число). В него он заносит данные по распределению ЗП производственных рабочих по проектам. Каждый раз при проведении документа происходит проверка на то чтобы сумма коэффициентов по сотруднику на дату документа с учетом данных, которые должен внести документ не превышала 1. Я пошел таким способом:
Сделал подписку на событие обработка проведения данного документа.
Беру срез последних на дату документа из регистра в котором хранятся данные за исключением тех которые были внесены ранее данным документом если он перепроводится, а не создается новый, заношу их в таблицу значений, потом считываю данные из табличной части проводимого документа и добавляю их в таблицу значений.
Таблицу значений заношу в другой регистр сведений и по нему беру срез последних и считаю коэффициент если он больше 1 то выдается сообщение пользователю и отменяю проведение документа.
Процедура ПроверкаРаспределенияСотрудниковПоПроектамОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт
   
   КоличествоСтрок=Источник.Участие.Количество();
   Если КоличествоСтрок=0 Тогда
       Сообщить("Не указаны проекты для сотрудника!",);
       Отказ=Истина;
   КонецЕсли;    
   
   Запрос = Новый Запрос;
   Запрос.Текст =
       "ВЫБРАТЬ
       |    УчастиеВПроектахСрезПоследних.Проект,
       |    СУММА(УчастиеВПроектахСрезПоследних.КоэффициентУчастия) КАК Сумма,
       |    УчастиеВПроектахСрезПоследних.Период
       |ИЗ
       |    РегистрСведений.УчастиеВПроектах.СрезПоследних(
       |            &Период,
       |            Сотрудник = &Сотрудник
       |                И НЕ Регистратор = &Регистратор) КАК УчастиеВПроектахСрезПоследних
       |
       |СГРУППИРОВАТЬ ПО
       |    УчастиеВПроектахСрезПоследних.Проект,
       |    УчастиеВПроектахСрезПоследних.Период";

   Запрос.УстановитьПараметр("Период", Источник.Дата);
   Запрос.УстановитьПараметр("Сотрудник", Источник.Сотрудник);
   Запрос.УстановитьПараметр("Регистратор", Источник.Ссылка);
   Результат = Запрос.Выполнить();

   УчастиеСотрудника=Результат.Выбрать();
   ТаблицаЗначений=Новый ТаблицаЗначений;
   ТаблицаЗначений.Колонки.Добавить("Проект",,"Проект");
   ТаблицаЗначений.Колонки.Добавить("Период",,"Период");
   ТаблицаЗначений.Колонки.Добавить("КоэффициентУчастия",,"КоэффициентУчастия");
   Пока УчастиеСотрудника.Следующий() Цикл
       Стр=ТаблицаЗначений.Добавить();
       Стр.Проект=УчастиеСотрудника.Проект;
       Стр.Период=УчастиеСотрудника.Период;
       Стр.КоэффициентУчастия=УчастиеСотрудника.Сумма;
   КонецЦикла;
   Для Каждого СтрТЧ из Источник.Участие Цикл
       Стр=ТаблицаЗначений.Добавить();
       Стр.Проект=СтрТЧ.Проект;
       Стр.Период=Источник.Дата;
       Стр.КоэффициентУчастия=СтрТЧ.КоэффициентУчастия;
   КонецЦикла;
   НаборЗаписей= РегистрыСведений.УчастиеВпроектахПромежуточный.СоздатьНаборЗаписей();
   НаборЗаписей.Загрузить(ТаблицаЗначений);                      
   НаборЗаписей.Записать();
   
   Запрос = Новый Запрос;
   Запрос.Текст =
        "ВЫБРАТЬ
    |    СУММА(УчастиеВпроектахПромежуточныйСрезПоследних.КоэффициентУчастия) КАК Сумма
    |ИЗ                                              
    |    РегистрСведений.УчастиеВпроектахПромежуточный.СрезПоследних(&Период, ) КАК УчастиеВпроектахПромежуточныйСрезПоследних";

   Запрос.УстановитьПараметр("Период", Источник.Дата);

   Результат = Запрос.Выполнить().Выбрать();

           
       Если Не Результат.Сумма=1 Тогда
           Сообщить("Сумма коэффициентов участия сотрудника  "+ Источник.Сотрудник+" не равна 1 !",);
           Отказ=Истина;
       КонецЕсли;
   
КонецПроцедуры
23 Volhvus
 
26.07.12
16:53
Есть предположение, что возникает промлема к обращению в регистр сведений из общего модуля, но какая пока не нашел.
24 Volhvus
 
27.07.12
09:42
Проблема решена, нашел ошибки в коде. Всем спасибо за помошь.
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.