Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как использовать данные из регистра сведений
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
martyn
Пока Выборка.Следующий() Цикл
       ЧекККМ = Выборка.Ссылка.ПолучитьОбъект();

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


не знаю как это сделать - подскажите??? сам не программист 1С - но приходится влазить.


 ! 

Правила: 3, 12
 
sava1
Если в выборке одна запись, тогда

Товар.Склад = ВыборкаСклад[0].Склад


а если несколько ?
ignsv
Цитата(martyn @ 12.11.14, 12:47) необходимо зарегистрироваться для просмотра ссылки
Если ВыборкаСклад.Количество() > 0 Тогда
Товар.Склад = вот здесь надо присвоить данные из запроса...
КонецЕсли;


Если ВыборкаСклад.Следующий() Тогда
        Товар.Склад =СкладВыборкаДетальныеЗаписи.Склад;
Конецесли;

TipsyKID
Запрос в цикле ?
Это очень плохо.
Надо переработать сам алгоритм получения Склада, а для этого нужен код который формирует Выборку.
Пока Выборка.Следующий() Цикл

Необходимо знать что написано до этой строки.
martyn
Цитата(sava1 @ 12.11.14, 14:10) необходимо зарегистрироваться для просмотра ссылки
Если в выборке одна запись, тогда

Товар.Склад = ВыборкаСклад[0].Склад


а если несколько ?


{Форма.Форма.Форма(39)}: Значение не является значением объектного типа (Склад)
Товар.Склад = ВыборкаСклад[0].Склад;
sava1
И чем №3 отличается от №2 ?
martyn
Цитата(TipsyKID @ 12.11.14, 14:16) необходимо зарегистрироваться для просмотра ссылки
Запрос в цикле ?
Это очень плохо.
Надо переработать сам алгоритм получения Склада, а для этого нужен код который формирует Выборку.
Пока Выборка.Следующий() Цикл

Необходимо знать что написано до этой строки.


ЗапросЧековККМ = Новый Запрос;

ЗапросЧековККМ.Текст =
"ВЫБРАТЬ
| ЧекККМ.Ссылка как Ссылка
|ИЗ
| Документ.ЧекККМ КАК ЧекККМ
|ГДЕ НЕ ЧекККМ.Проведен";

Выборка=ЗапросЧековККМ.Выполнить().Выбрать();
sava1
Да, запрос надо-бы переписать в один

Что нужно получить в результате?

А что это за хрень - Товар.Склад ?

В документ так просто не впишешься
martyn
Цитата(sava1 @ 12.11.14, 14:22) необходимо зарегистрироваться для просмотра ссылки
Да, запрос надо-бы переписать в один


Да Бог с ним запросом - как мне из РегистраСведений.РаспределениеПродаж складу товара присвоить значение - выбранное запросом?

РаспределениеПродаж

Измерения

- Магазин
- НоменклатурнаяГруппа
- УдалитьКассаККМ
- РабочееМесто

Ресурсы
- Склад

в конфигураторе смотрю, Тип ресурса Склад - СправочникиСссылка.Склады

sava1
РаспределениеПродаж - независимый? непериодический?
alex040269
Цитата(martyn @ 12.11.14, 13:26) необходимо зарегистрироваться для просмотра ссылки
РегистраСведений.РаспределениеПродаж складу товара присвоить значение

нельзя присвоить значение. можно только записать набор записей с заменой или без.
Набор = РегистрыСведений.Имя.СоздатьНаборЗаписей();
Набор.Отбор.ИмяРеквОтбора.Установить(Значение);
НовСтрока = Набор.Добавть();
НовСтрока.ИмяРевизита = Значние;
Набор.Записать();
martyn
Цитата(alex040269 @ 12.11.14, 14:33) необходимо зарегистрироваться для просмотра ссылки
нельзя присвоить значение. можно только записать набор записей с заменой или без.
Набор = РегистрыСведений.Имя.СоздатьНаборЗаписей();
Набор.Отбор.ИмяРеквОтбора.Установить(Значение);
НовСтрока = Набор.Добавть();
НовСтрока.ИмяРевизита = Значние;
Набор.Записать();


это я буду записывать в РегистрСведений? правильно я понимаю?

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

Цитата(sava1 @ 12.11.14, 14:30) необходимо зарегистрироваться для просмотра ссылки
РаспределениеПродаж - независимый? непериодический?


независимый, непереодический
sava1
Полю Склад чего - документа?
TipsyKID
Перед тестированием , сделайте архивную копию !!!!!
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    ЧекККМТовары.*,
|    РаспределениеПродаж.Склад КАК Склад
|ИЗ
|    Документ.ЧекККМ.Товары КАК ЧекККМТовары
|        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаспределениеПродаж  КАК РаспределениеПродаж
|        ПО ЧекККМТовары.Номенклатура.НоменклатурнаяГруппа = РаспределениеПродаж .НоменклатурнаяГруппа
|ГДЕ
|    НЕ ЧекККМТовары.Ссылка.Проведен";

Выборка = Запрос.Выполнить().выбрать();
МакКвоВТранзакции = 500;
ТекКол = 0;
НачатьТранзакцию();
ТекДок = Неопределено;
пока Выборка.Следующий() цикл
    ТекКол = ТекКол + 1;
    Если ТекКол = МакКвоВТранзакции тогда
        ЗафиксироватьТранзакцию();
        НачатьТранзакцию();
        ТекКол = 0;
    КонецЕсли;
    
    Если НЕ ЗначениеЗаполнено(ТекДок) тогда
        ТекДок = Выборка.Ссылка.ПолучитьОбъект();
                ТекДок.Товары.Очистить();
    ИначеЕсли ТекДок <> Выборка.Ссылка тогда
        ТекДок.Записать();
        ТекДок = Выборка.Ссылка.ПолучитьОбъект();
                ТекДок.Товары.Очистить();

    КонецЕсли;
        НоваяСтрока = ТекДок.Товары.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка,,"Ссылка,НомерСтроки");

Конеццикла;
ЗафиксироватьТранзакцию();
martyn
Цитата(sava1 @ 12.11.14, 14:41) необходимо зарегистрироваться для просмотра ссылки
Полю Склад чего - документа?


Товаров в документе - сам принцип объясните, как обрашаться к значению Реквизита в РегистреСведений

sava1
(14) Вполне прилично.
Выборку сгруппировать по Документ,строка и перебирать по группировкам - тогда не надо отслеживать ТекДок
TipsyKID
Насколько я понял, Вам необходимо перебрать все не проведенные чекиККМ и для табличной части Товары проставить Склад , такой какой указан для номенклатурной группы из регистра "РаспределениеПродаж".
Если это так, то используйте мой код ( сделав архивную копию )
sava1
Цитата(martyn @ 12.11.14, 13:47) необходимо зарегистрироваться для просмотра ссылки
как обрашаться к значению Реквизита в РегистреСведений


К регистру - прочитать - запросом, записать - набор записей/менеджер ....
К документу - для изменения нужно иметь обЪект, а не выборку
TipsyKID
Цитата(sava1 @ 12.11.14, 13:49) необходимо зарегистрироваться для просмотра ссылки
(14) Вполне прилично.
Выборку сгруппировать по Документ,строка и перебирать по группировкам - тогда не надо отслеживать ТекДок

Уже понял , что надо было сделать группировку на этапе когда переписал запрос под не существующий у меня регистр , лень было, если честно, вручную запрос править, легче отловить документ, но Вы правы, так было - бы правильней.
sava1
Цитата(TipsyKID @ 12.11.14, 13:43) необходимо зарегистрироваться для просмотра ссылки
|    ЧекККМТовары.*,
|    РаспределениеПродаж.Склад КАК Склад


Там не получиться два поля Склад ?
martyn
Цитата(sava1 @ 12.11.14, 14:57) необходимо зарегистрироваться для просмотра ссылки
Там не получиться два поля Склад ?


получится...
TipsyKID
Цитата(sava1 @ 12.11.14, 13:57) необходимо зарегистрироваться для просмотра ссылки
Там не получиться два поля Склад ?

Нет. Через * присвоится Склад1, а тот что указан явно через псевдоним будет с наименованием Склад.
Единственное, что опасно, это если в регистре сведений будет много записей с одной номенклатурной группой, это надо ограничить на уровне Магазина ( насколько видно из архитектуры Регистра)
sava1
Посмотрел в УТП. Четто не догнал - Склад реквизит Шапки.
А если в ТЧ.Товары будут товары с разными Ном.Группами (Складами) - что Вы будете делать ?
martyn
Цитата(sava1 @ 12.11.14, 15:04) необходимо зарегистрироваться для просмотра ссылки
Посмотрел в УТП. Четто не догнал - Склад реквизит Шапки.
А если в ТЧ.Товары будут товары с разными Ном.Группами (Складами) - что Вы будете делать ?


для каждого товара в ТЧ есть свой склад - который надо заполнить из регистра сведений на основании Номенклатурной группы.

странно - взял кусок кода из конфигурации

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


когда я пишу - Товар.Склад = Выборка.Склад - ничего не присваивается
alex040269
Цитата(martyn @ 12.11.14, 14:20) необходимо зарегистрироваться для просмотра ссылки
Товар.Склад = Выборка.Склад

это нужно писать после строки
Пока Выборка.Следующий() Цикл

и до строки
КонецЦикла
sava1
А в Выборке хоть что-то есть?

Цитата(alex040269 @ 12.11.14, 14:29) необходимо зарегистрироваться для просмотра ссылки
это нужно писать после строки

А где видно что пишется до и после?
martyn
все - разобрался - всем спасибо...

проблема была здесь

Для каждого Товар из ЧекККМ.Товары Цикл 
          
          ЗапросСклад = Новый Запрос;
          
          ЗапросСклад.Текст =
              "ВЫБРАТЬ
              |    РаспределениеПродаж.Склад как Склад
              |ИЗ
              |    РегистрСведений.РаспределениеПродаж КАК РаспределениеПродаж
              |ГДЕ
              |    РаспределениеПродаж.НоменклатурнаяГруппа = &НоменклатурнаяГруппа";
    
              ЗапросСклад.УстановитьПараметр("НоменклатурнаяГруппа", Товар.Номенклатура.НоменклатурнаяГруппа);
              
              ВыборкаСклад = ЗапросСклад.Выполнить().Выбрать();          
              
              Пока ВыборкаСклад.Следующий() Цикл // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
              
                Если ВыборкаСклад.Количество() > 0 Тогда
                    Товар.Склад = ВыборкаСклад.Склад;  
                КонецЕсли;      
              
              КонецЦикла;
          
      КонецЦикла;
sava1
Цитата(martyn @ 12.11.14, 14:32) необходимо зарегистрироваться для просмотра ссылки
Пока ВыборкаСклад.Следующий() Цикл

Я что-то пропустил ?
Vofka
martyn, выделяйте код! В следующий раз удалю сообщение.
sava1
"Ты суслика видишь?...."
martyn
Цитата(sava1 @ 12.11.14, 15:41) необходимо зарегистрироваться для просмотра ссылки
"Вы суслика видишь?...."


а он есть... еще раз всем спасибо

Цитата(Vofka @ 12.11.14, 15:40) необходимо зарегистрироваться для просмотра ссылки
martyn, выделяйте код! В следующий раз удалю сообщение.


понял
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.