Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
23 ноя 2024, 06:41

Связать справочник и регистр накопления

Автор Tubog, 05 мая 2024, 23:49

0 Пользователей и 1 гость просматривают эту тему.

Максим75

Tubog, ай, да как же все запущено.
ТекСтрока.Контрагент.Наименование - Вы получите наименование элемента справочника.
Когда есть ссылка, то через точку можно получить любой реквизит этого ссылочного типа, ну т.е. для справочника - все реквизиты, какие есть у данного справочника, для документа - что есть у данного вида документа и т.д.

Tubog

Максим75, извиняюсь за глупые вопросы, но я только начинаю жить в 1С(

antoneus

Но лучше отсекать ненужных контрагентов еще на уровне запроса. Например, так:

| ГДЕ
|   НЕ НоменклатураС.ЭтоГруппа
|   И НЕ НоменклатураС.ПометкаУдаления
|   И НоменклатураС.Ссылка В ИЕРАРХИИ(&Номенклатура)
|   И СписокЗакупки.Контрагент.Наименование = ""Рога и Копыта""

А лучше так:

| ГДЕ
|   НЕ НоменклатураС.ЭтоГруппа
|   И НЕ НоменклатураС.ПометкаУдаления
|   И НоменклатураС.Ссылка В ИЕРАРХИИ(&Номенклатура)
|   И СписокЗакупки.Контрагент = &Контрагент
.........
Запрос.УстановитьПараметр("Контрагент", Справочники.Контрагенты.НайтиПоНаименованию("Рога и копыта"));
//а еще лучше искать по ИНН: Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", "6461351351313"); - подставить ИНН


Tubog

Максим75, огромное спасибо. Получилось выгрузить. Удалось продвинуться дальше. Таблица формируется по поставщику и по указанному периоду времени. Но в итоговой таблице имеются 2 абсолютно идентичные строки. Прошу помощи в их объединении.


Процедура ВыгрузитьНоменклатуру(ПараметрыВыгрузки)
   
   ТЗСписокЗакупки = ПолучитьСписокЗакупки();
   
   ИмяФайлаCSV = Каталог + "\ttt.csv";
   
   ТекстCSV = "";
   
   // заголовки для файла продаж
   ТекстCSV = ТекстCSV + "id дистрибьютера" + ПараметрыВыгрузки.Разделитель;
   ТекстCSV = ТекстCSV + "Код продукта дистрибьютера" + ПараметрыВыгрузки.Разделитель;
   ТекстCSV = ТекстCSV + "Название продукта" + ПараметрыВыгрузки.Разделитель;
   ТекстCSV = ТекстCSV + "Штрихкод" + ПараметрыВыгрузки.Разделитель;
   ТекстCSV = ТекстCSV + "Код продукта производителя" + ПараметрыВыгрузки.Разделитель;
   ТекстCSV = ТекстCSV + "id единицы измерения продукта" + ПараметрыВыгрузки.Разделитель;
   ТекстCSV = ТекстCSV + Символы.ПС;
            
   // данные
   Для Каждого ТекСтрока Из ТЗСписокЗакупки Цикл
      Если ТекСтрока.Контрагент.Наименование = "Рога и копыта" Тогда // Истина
        // блок операторов
        ТекстCSV = ТекстCSV + ПараметрыВыгрузки.idДистрибьютера + ПараметрыВыгрузки.Разделитель;
      ТекстCSV = ТекстCSV + ПроверитьНаНедопустимыеСимволыCSV(ТекСтрока.НоменклатураКод) + ПараметрыВыгрузки.Разделитель;
      ТекстCSV = ТекстCSV + ПроверитьНаНедопустимыеСимволыCSV(ТекСтрока.НоменклатураНаименование) + ПараметрыВыгрузки.Разделитель;
      ТекстCSV = ТекстCSV + ПроверитьНаНедопустимыеСимволыCSV(ТекСтрока.Штрихкод) + ПараметрыВыгрузки.Разделитель;
      ТекстCSV = ТекстCSV + ПроверитьНаНедопустимыеСимволыCSV(ТекСтрока.КодПроизводителя) + ПараметрыВыгрузки.Разделитель;
      ТекстCSV = ТекстCSV + ТекСтрока.КодЕдиницыИзмерения + ПараметрыВыгрузки.Разделитель;
      ТекстCSV = ТекстCSV + Символы.ПС;
   КонецЕсли;
   
КонецЦикла;

Запрос = Новый Запрос;
    Запрос.Текст = "

   | ВЫБРАТЬ
      |idДистрибьютера,
      |Код продукта дистрибьютера,
      | Название продукта,
      |  Штрихкод,
      | Код продукта производителя,
      |СУММ(id единицы измерения продукта)
      
     | ИЗ
      | ТЗСписокЗакупки
    
     |СГРУППИРОВАТЬ ПО
      |  Код продукта дистрибьютера,Название продукта ";

         
    ЗаписатьCSV(ТекстCSV, ИмяФайлаCSV);
   
   Если ПараметрыВыгрузки.ПоказыватьСообщения Тогда
      Сообщить("Файл <" + ИмяФайлаCSV + "> сохранен.", СтатусСообщения.Внимание);
   КонецЕсли;
         
КонецПроцедуры


Так не объединяются((((

Максим75

Tubog, вот честно говоря, вообще ничего не понятно  :dfbsdfbsdf:

дайте запрос, которым Вы получаете таблицу значений, потому как запрос в конце - это прямо нечто  :dfbsdfbsdf:

Tubog

Максим75,

Перем мЕстьОшибки;
Перем мТекстОшибок;
Перем ПеНачалоПериода;
Перем ПеКонецПериода;

Процедура ПриОткрытии()
      
   УстановитьПериод();
   
   Если ИмяПользователя() = "ten" Тогда
      Каталог = КаталогВременныхФайлов();
      
      Номенклатура = Справочники.Номенклатура.НайтиПоКоду("00000000079");   // должен быть предопределенным элементом
      
      ВыгрузитьДанные(Ложь);
               
      // Закрытие программы 1С.
      Если мЕстьОшибки Тогда
         Сообщить(мТекстОшибок, СтатусСообщения.ОченьВажное);
      Иначе
         ЗавершитьРаботуСистемы(Ложь);
      КонецЕсли;
   КонецЕсли;
      
КонецПроцедуры


Процедура УстановитьПериод()
   
   НачалоПериода = НачалоДня(ТекущаяДата();
   КонецПериода  = КонецДня(ТекущаяДата();
   
КонецПроцедуры

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

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

Процедура КаталогОткрытие(Элемент, СтандартнаяОбработка)
   
   ЗапуститьПриложение("explorer " + Элемент.Значение);
   СтандартнаяОбработка = Ложь;   
   
КонецПроцедуры

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


Процедура ВыгрузитьДанные(ПоказыватьСообщения)
   
   мЕстьОшибки = Ложь;
   мТекстОшибок = "";
   
   Если Не ЗначениеЗаполнено(НачалоПериода) Тогда           
      мЕстьОшибки = Истина;
      ТекстСообщения = "Не указана Дата начала выгрузки. Выгрузка невозможна!";
      мТекстОшибок = ?(мТекстОшибок = "", ТекстСообщения, мТекстОшибок +  Символы.ПС + ТекстСообщения);
   КонецЕсли;
   
   Если Не ЗначениеЗаполнено(КонецПериода) Тогда                   
      мЕстьОшибки = Истина;
      ТекстСообщения = "Не указана Дата окончания выгрузки. Выгрузка невозможна!";
      мТекстОшибок = ?(мТекстОшибок = "", ТекстСообщения, мТекстОшибок +  Символы.ПС + ТекстСообщения);
   КонецЕсли;
   
   Если Не ЗначениеЗаполнено(Номенклатура) Тогда
      мЕстьОшибки = Истина;
      ТекстСообщения = "Не выбрана Номенклатура для выгрузки. Выгрузка невозможна!";
      мТекстОшибок = ?(мТекстОшибок = "", ТекстСообщения, мТекстОшибок +  Символы.ПС + ТекстСообщения);
   КонецЕсли;
   
   Если мЕстьОшибки Тогда
      Возврат;
   КонецЕсли;
   
   Если Не ЗначениеЗаполнено(Каталог) Тогда
      Каталог = КаталогВременныхФайлов();
   КонецЕсли;
   
   ПараметрыВыгрузки = Новый Структура;
   ПараметрыВыгрузки.Вставить("Разделитель"            , ";");
   ПараметрыВыгрузки.Вставить("idДистрибьютера"        , 82);
   ПараметрыВыгрузки.Вставить("КодНоменклатурыДляНулей", "00000000092"); // код номенклатуры для дней с нулевыми движениями товара
   ПараметрыВыгрузки.Вставить("ПоказыватьСообщения"    , ПоказыватьСообщения);
   
   
   ВыгрузитьЗакупки(ПараметрыВыгрузки);
   
   
   Если ПоказыватьСообщения Тогда
      Сообщить("Выгрузка файлов в папку <" + Каталог + "> завершена!", СтатусСообщения.ОченьВажное);
   КонецЕсли;
      
КонецПроцедуры


Процедура ВыгрузитьНоменклатуру(ПараметрыВыгрузки)
   
   ТЗСписокЗакупки = ПолучитьСписокЗакупки();
   
   ИмяФайлаCSV = Каталог + "\ttt.csv";
   
   ТекстCSV = "";
   
   // заголовки для файла продаж
   ТекстCSV = ТекстCSV + "id дистрибьютера" + ПараметрыВыгрузки.Разделитель;
   ТекстCSV = ТекстCSV + "Код продукта дистрибьютера" + ПараметрыВыгрузки.Разделитель;
   ТекстCSV = ТекстCSV + "Название продукта" + ПараметрыВыгрузки.Разделитель;
   ТекстCSV = ТекстCSV + "Штрихкод" + ПараметрыВыгрузки.Разделитель;
   ТекстCSV = ТекстCSV + "Код продукта производителя" + ПараметрыВыгрузки.Разделитель;
   ТекстCSV = ТекстCSV + "id единицы измерения продукта" + ПараметрыВыгрузки.Разделитель;
   ТекстCSV = ТекстCSV + Символы.ПС;
            
   // данные
   Для Каждого ТекСтрока Из ТЗСписокЗакупки Цикл
      Если ТекСтрока.Контрагент.Наименование = "Рога и копыта" Тогда // Истина
        // блок операторов
        ТекстCSV = ТекстCSV + ПараметрыВыгрузки.idДистрибьютера + ПараметрыВыгрузки.Разделитель;
      ТекстCSV = ТекстCSV + ПроверитьНаНедопустимыеСимволыCSV(ТекСтрока.НоменклатураКод) + ПараметрыВыгрузки.Разделитель;
      ТекстCSV = ТекстCSV + ПроверитьНаНедопустимыеСимволыCSV(ТекСтрока.НоменклатураНаименование) + ПараметрыВыгрузки.Разделитель;
      ТекстCSV = ТекстCSV + ПроверитьНаНедопустимыеСимволыCSV(ТекСтрока.Штрихкод) + ПараметрыВыгрузки.Разделитель;
      ТекстCSV = ТекстCSV + ПроверитьНаНедопустимыеСимволыCSV(ТекСтрока.КодПроизводителя) + ПараметрыВыгрузки.Разделитель;
      ТекстCSV = ТекстCSV + ТекСтрока.КодЕдиницыИзмерения + ПараметрыВыгрузки.Разделитель;
      ТекстCSV = ТекстCSV + Символы.ПС;
   КонецЕсли;
   
КонецЦикла;

   
    ЗаписатьCSV(ТекстCSV, ИмяФайлаCSV);
   
   Если ПараметрыВыгрузки.ПоказыватьСообщения Тогда
      Сообщить("Файл <" + ИмяФайлаCSV + "> сохранен.", СтатусСообщения.Внимание);
   КонецЕсли;
         
КонецПроцедуры
Функция ПолучитьСписокЗакупки()
    Запрос = Новый Запрос;
    Запрос.Текст = "
   
            |ВЫБРАТЬ
|   СписокЗакупки.Контрагент КАК Контрагент,
|   НоменклатураС.Код КАК НоменклатураКод,
|   НоменклатураС.НаименованиеПолное КАК НоменклатураНаименование,
|   ЕСТЬNULL(ВТ_Штрихкоды.Штрихкод, """") КАК Штрихкод,
|   """" КАК КодПроизводителя,
|   1 КАК КодЕдиницыИзмерения
|ИЗ
|   Справочник.Номенклатура КАК НоменклатураС
|       СОЕДИНЕНИЕ РегистрНакопления.Закупки КАК СписокЗакупки
|      ПО НоменклатураС.Ссылка = СписокЗакупки.Номенклатура
|      ЛЕВОЕ СОЕДИНЕНИЕ  РегистрСведений.Штрихкоды КАК ВТ_Штрихкоды
|      ПО НоменклатураС.Ссылка = ВТ_Штрихкоды.Владелец

| ГДЕ
|   НЕ НоменклатураС.ЭтоГруппа
|   И НЕ НоменклатураС.ПометкаУдаления
//|   И НоменклатураС.Ссылка В (&Номенклатура)
|   И СписокЗакупки.Контрагент = &Контрагент
|   И СписокЗакупки.Период МЕЖДУ &НачалоПериода И &КонецПериода";
           
    Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
    Запрос.УстановитьПараметр("КонецПериода", КонецПериода);
    Запрос.УстановитьПараметр("Контрагент", Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", "4802024211"));
   
   
   // СГРУППИРОВАТЬ ПО НоменклатураКод ;        //, НоменклатураНаименование,Штрихкод,КодПроизводителя,КодЕдиницыИзмерения ИЗ СписокЗакупки ГДЕ Условие ГРУППИРОВАТЬ ПО НоменклатураНаименование " ;
    РезультатЗапроса = Запрос.Выполнить();
   
   
    Возврат РезультатЗапроса.Выгрузить();
КонецФункции

Вроде бы все, запрос в конце предыдущего поста удалил, заранее благодарю

Максим75

Tubog, смотрите, у Вас в запросе идет соединение справочника Нонемклатура с неким регистром накопления Закупки, связь делаете по номенклатуре.
Вопрос, а сколько записей по каждой номенклатуре у Вас в данном регистре? Вы понимаете, что может быть много записей по одной номенклатуре, поэтому при соединении Вы получить много записей в итоговой таблице.
Как минимум надо сделать вложенный запрос по этому регистру (с условием по нужному конрагенту и по нужному периоду) и сгруппировать по товару.
А так Вы получаете ВСЕ записи (именно записи) из этого регистра по каждому товару, т.е. если за все время товар поставлялся 10 раз (даже одним конрагентом), Вы получите 10 записей в итоговой выборке.

и вот это:
|   И СписокЗакупки.Контрагент = &Контрагент
|   И СписокЗакупки.Период МЕЖДУ &НачалоПериода И &КонецПериода";

это вообще не комильфо, у Вас есть регистр накопления, значит у него есть виртуальная таблица, вот накладывайте условия прямо в виртуальной таблице (по периоду, по нужному контрагенту).

Да и пока вообще логика не понятна, что Вы хотите получить. Вам надо получить список товаров, которые поставлялись конкретным поставщиком за определенный период? Если да, то логика запроса совсем другая должна быть.

Tubog

Максим75, да, нужно получить список товаров, которые поставлялись конкретным поставщиком за определенный период? Проблема в том, что параметр _Код продукта дистрибьютера_ и наименование продукта расположены в справочнике номенклатура, наименование продукта и поставщик в регистре накопления, а штрихкод в регистре сведений. У меня была мысль, объединить таблицу регистра накопления со справочником номенклатуры по принципу join, что я и сделал. Но теперь проблема в объединении по принципу count group by sum.
Какую логику предлагаете использовать Вы?

Максим75

Tubog, я не особо силен в этих принципах))
Итак, получаете выборку с регистра сведений, сразу в виртуальной таблице регистра накладываете условия на период и на контрагента. Выборку делаете через вложенный запрос, вложенный запрос группируете по номенклатуре. таким образом Вы сразу получите ВСЮ номенклатуру, которую в данном периоде поставлял поставщик. Здесь же через точку (типа такого Номенклатура.Ссылка.Наименование и т.д.) получаете любой реквизит из справочника.
останется только штрих-коды. Смотрите, как у Вас в базе штрих-коды заведены, я имею ввиду одна номенклатура - один штрих код, или возможен вариант когда на одну номенклатуру несколько штрих-кодов. У меня в базе несколько. И поэтому простым соединением Вы получите несколько записей на одну номенклатуру.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск