• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

7.7 Количество Измерений В Регистре

  • Автор темы olga13
  • Дата начала
O

olga13

Добрый день! В продолжение темы о регистрах. Что-то никто не отвечает, решила вынести в отдельную тему.
Нужен совет, как лучше поступить.
Имеется регистр остатков "Остатки товаров на комиссии" со следующими измерениями:
Фирма, Комитент, Договор, Товар, Партия, СтрокаПартии.
Есть необходимость для документа "Отчет комиссионера" получать сведения о стране происхождения товара. Получить их можно из приходных документов.
Вопрос: что лучше - добавить в регистр измерение "Страна" либо крутить в цикле запрос, который из приходов будет вытаскивать нужные сведения?
 
P

puh14

Если фильтровать по стране не надо, можно вытащить функцией (можно в запросы подставлять свои функции, а не только пользоваться типовыми). Если надо фильтровать - то лучше измерение. Но учтите - придется править проведения по этому регистру и перепроводить имеющиеся документы. Могут вылезти косяки.
 
H

Hryv

У вас Партия - это что? Справочник или документ? Нельзя ли там хранить Страну?
В запросе тогда будет достаточно удобно с ней работать
 
Д

Дайнеко

Ну парни! Если понимать, что Страна, это страна поставщика, то сделать реквизит у клиента. Если страна ввоза, то прицепить к партии. И все Ок.

Чем меньше измерений регистра, тем лучше со всех сторон. "СтрокаПартии" непонятный реквизит.
 
H

Hryv

Ну парни! Если понимать, что Страна, это страна поставщика, то сделать реквизит у клиента. Если страна ввоза, то прицепить к партии. И все Ок.
В вопросе прозвучало "получать сведения о стране происхождения товара"

"СтрокаПартии" непонятный реквизит.
О! Я невнимательно посмотрел и его не заметил.
Раз так, то очевидно
Партия - приходный док
СтрокаПартии - его строка

тогда добавлять измерение Страна не вижу никакого смысла, не может быть чтобы ее не было ни в Партии ни в ТрокаПартии


Если же там все иначе организовано, то зря :)
 
Д

Дайнеко

В вопросе прозвучало "получать сведения о стране происхождения товара"

Вот сразу спец-казуист виден! :)
Не надо придавать большого значения словам из нежных девичьих уст. Я всегда говорю: женщина думает одно, говорит другое (причем верит во что говорит), а на самом деле все по-третьему. Наверняка нужно в каком-нить отчете остатков товаров показать колонку Партия.Поставщик.Страна.
 
O

olga13

Я всегда говорю: женщина думает одно, говорит другое (причем верит во что говорит), а на самом деле все по-третьему. Наверняка нужно в каком-нить отчете остатков товаров показать колонку Партия.Поставщик.Страна.

Не в отчете, а в модуле проведения нужно использовать субконто "Страна происхождения". И привязать его к поставщику нельзя - один и тот же поставщик может продавать товары, ввезенные из разных стран. Если бы можно было вытаскивать через Партия.Страна и проблемы бы не было. А поскольку Страна в табличной части, нужно как-то извращаться. Добавлять измерение не хочется, их и так много. Через запрос долго - в документе 2500-3000 строк.
 
P

puh14

Ну раз нету Партия.Страна - добавьте, напишите обработочку, которая всё заполнит, в процедуре создания партии пропишите заполнение страны из таб части.
 
O

olga13

Ну раз нету Партия.Страна - добавьте, напишите обработочку, которая всё заполнит, в процедуре создания партии пропишите заполнение страны из таб части.

Уже написала. На учебном примере работает, на реальном объеме данных пишет "Недостаточно памяти". Посему вопрос и возник - может, все-таки лучше измерение добавить?
 
H

Hryv

P

puh14

Уже написала. На учебном примере работает, на реальном объеме данных пишет "Недостаточно памяти". Посему вопрос и возник - может, все-таки лучше измерение добавить?

текст обработки в студию - я такое видел только при циклическом создании хреновой тучи объектов.
 
O

olga13

Если у вас

то зачем извращаться, если


:wacko:


Может, я туплю, но я не представляю как быстро получить значение Страны имея эти данные. Ведь СтрПартии не всегда равна номеру строки приходного документа. В идеале они совпадают, но если документ редактировался (удалялись строки, сортировались и т.д.), то номера не совпадают. Сначала нужно каким-то образом спозиционироваться на нужную строку в приходе.

Добавлено:
текст обработки в студию - я такое видел только при циклическом создании хреновой тучи объектов.

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

Код:
Функция глПолучитьАтрибутыПартии(Товар, Партия, СтрПартии, Рег) Экспорт
глСписок = СоздатьОбъект("СписокЗначений");
РегБН = СоздатьОбъект("Регистр." + Рег);
Если (Рег = "ОстаткиТоваровОтгруженных") или (Рег = "ОстаткиТоваровНаКомиссии") Тогда
РегБН.УстановитьФильтр(,,,Товар,Партия,СтрПартии);
Иначе
РегБН.УстановитьФильтр(,Товар,Партия,СтрПартии);
КонецЕсли;
РегБН.ВыбратьДвижения(Партия.ДатаДок, Партия.ДатаДок);
Пока РегБН.ПолучитьДвижение() = 1 Цикл
Если РегБН.СтрПартии = СтрПартии Тогда
Если Партия.ПолучитьСтрокуПоНомеру(РегБН.НомерСтроки()) = 1 Тогда
глСписок.ДобавитьЗначение(Партия.Контрагент);
глСписок.ДобавитьЗначение(Партия.Договор);
глСписок.ДобавитьЗначение(Партия.ТТН);
глСписок.ДобавитьЗначение(Партия.Страна);
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;

Возврат глСписок;

КонецФункции
 
P

puh14

Мда - тут налицо действительно превышение максимальных размеров списка.

Я имел ввиду другое - делаете в справочнике партия ТМЦ дополнительный реквизит типа справочник страны (или как там у вас страна хранится) и обработкой заполняете его например так:

Код:
Партия = СоздатьОбъект("Справочник.партииТМЦ");
Док = СоздатьОбъект("документ.ПоступлениеТМЦ");
док.ВыбратьДокументы();
Пока док.ПолучитьДокумент() = 1 Цикл
Док.ВыбратьСтроки();
Пока Док.ПолучитьСтроку() = 1 Цикл
Если Партия.НайтиЭлемент(Док.Партия) >0 Тогда
Партия.Страна = Док.Страна;
Партия.Записать();
КонецЕсли;
КонецЦикла;
КонецЦикла;
И всё - у вас проствлены страны в партии.
 
V

vbs

puh14 все хорошо, только партии нужно искать по конкретному владельцу
 
A

Allexei

Если в регистре остатков движение будет происходить по стране как в плюс так и в минус то лучше сделать измерением регистра. Если нет гарантии того что регистр "будет закрываться по стране", добавлять в измерение нельзя ибо через некоторое время заметите что регистр начнет пухнуть, причем пухнуть очень быстро. С чем это связано. Приведу упрощенный пример. Допустим у нас есть регистр остатков "Остатки" с двумя измерениями "Товар" и "Страна" и ресурсом "Количество". Есть документы поступления с указанием страны и есть документы расхода без указания страны. Регистр остатков представляет собой виртуальную таблицу которая состоит из двух реальных - первая это таблица оборотов по регистру и вторая - таблица срезов актуальных остатков по регистру. Как получаются остатки на произволную дату: получаем наиболее близлежащий срез по второй таблице и в зависимости от положения на оси времени этого среза либо отнимае, либо прибавляем оборот по первой таблице. В нашем случае в таблице оборотов все будет относительно ровно, но вот в таблице остатков будут как минимум задвоеные записи(предположим у нас 1 товар и одна страна). Это будут остатки по следующим срезам: Товар_1 Страна_1 количество_1 и Товар_1 нетстраны Количество. А если у нас 1000 наименование и 10-20 стран... В общем проблем не оберетесь. Как то так...
 
O

olga13

все хорошо, только партии нужно искать по конкретному владельцу

Я тоже так думаю - лучше два справочника. Первый - справочник партий, второй - подчиненный, с набором реквизитов, характеризующих строку партии.

Если нет гарантии того что регистр "будет закрываться по стране", добавлять в измерение нельзя ибо через некоторое время заметите что регистр начнет пухнуть

На эти грабли я уже наступала :wacko:
 
H

Hryv

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

То что puh14 предлагает хороший вариант, но у вас в регистре, как я понял, нет измерения типа "Справочник.партииТМЦ", а Партия это Документ. Поэтому вам это вариант ничем не поможет.


К вашей обработке

Если РегБН.СтрПартии = СтрПартии Тогда - это не имеет смысла так как раньше включен фильтр
вы же не делаете проверок по Товар и Партия

А в отладчике вы ходили? Потому что я в упор не понимаю где там
налицо действительно превышение максимальных размеров списка.

Ведь цикл
Пока РегБН.ПолучитьДвижение() = 1 Цикл
должен всегда только 1 раз проходить и размер списка будет равен 4 (или ни разу и список пустой)

Может причины "Недостаточно памяти" в чем-то другом?

Добавлено:
Я тоже так думаю - лучше два справочника. Первый - справочник партий, второй - подчиненный, с набором реквизитов, характеризующих строку партии.

Оооо! И тут Астапа понесло
Не полодите вы эти справочники потом не разгр*цензура*е, особенно если возникнут проблемы с актуальностью данных (то есть в справочниках будет одно, а в доках другое - вероятность возникновения таких ситуаций хоть иногда стремиться к 100%)
разберитесь с ошибкой и пользуйтесь функцией - будет вам счастье
 
O

olga13

Только если в одном приходе один и тот же товар более чем в одной строке. Однако я лично не понимаю зачем делить остаток этого товара на части?

Это нужно в том случае, если в приходном документе один и тот же товар по разной цене или разных производителей.

То что puh14 предлагает хороший вариант, но у вас в регистре, как я понял, нет измерения типа "Справочник.партииТМЦ", а Партия это Документ. Поэтому вам это вариант ничем не поможет.

А мне в этом случае и не нужно измерение. Имея сведения о партии и строке партии можно из справочника получить все остальное.

А в отладчике вы ходили?

Ну естессно ходила. И в отладчике крутила, и замер производительности делала. Причину зависания не нашла.

особенно если возникнут проблемы с актуальностью данных

Можно данные поддерживать в актуальном состоянии - при проведении документа, например.
 
H

Hryv

Это нужно в том случае, если в приходном документе один и тот же товар по разной цене или разных производителей.
Ого, оказывается и так бывает :)

А мне в этом случае и не нужно измерение. Имея сведения о партии и строке партии можно из справочника получить все остальное.
....
Можно данные поддерживать в актуальном состоянии - при проведении документа, например.
То есть чтобы не искать ошибку, вы готовы создать новый справочник и механизм по его заполнению и чтению из него.
При том, что теоретически чем больше объектов и строк кода, тем больше потенциальных ошибок
И, наконец, та ошибка которая есть сейчас, ведь может еще потом аукнуться. Я лично на 99.99 уверен, что она не в глПолучитьАтрибутыПартии
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!