Имя: Пароль:
1C
1C 7.7
v7: Помогите решить алгоритм
, ,
0 oslokot
 
20.09.12
13:51
Для меня оказалось сложным, помогите.

Имеем связку двух документов:
1. На основании документа "Заявка покупателя" вводится документ "Х".
2. Табличная часть документа "Х" заполняется точь в точь из этой заявки, но потом сжимается по одинаковой номенклатуре
то есть по принципу Свернуть("Номенклатура","Количество").
3. Документ "Х" записывается и на этом всё.

Если что-то поменяли в заявке, например номенклатуру (изменили,удалили,новая)и т.п. то хочется синхронизировать все эти изменения и в документе "Х"

Попробовал решить вопрос назначением каждой позиции GUID, но чувствую не то..
Что посоветуете?
1 aleks-id
 
20.09.12
13:52
посоветую п.2 и п.3
2 Рэйв
 
20.09.12
13:54
Да заполни заново и сверни.  Тоже мне алгоритм...
3 ЧеловекДуши
 
20.09.12
13:54
(0)>>> Свернуть("Номенклатура","Количество").

Советую, уволиться... или познать коэфициент и единицы измерения и цены и скидки и НДС и т.д. :)
4 Heckfy
 
20.09.12
13:55
(3) Ну зачем так сразу. Может человеку только количество нужно. :):):
5 ЧеловекДуши
 
20.09.12
13:56
(0)>>> Документ "Х" записывается и на этом всё.

Предложение, уйти в дворники все еще в силе...
А так, какой смысл дальнейшего использования документа, который даже не проводится и походу вообще не содержит движения по регистрам и не попадает в различные отчеты :)
6 oslokot
 
20.09.12
13:56
(1) (2) нет, дело в том что документ "Х" делает некие записи в служебных справочниках которые хотелось бы сохранить.
Мне обновить нужно позиции, а не заново перезаполнить!
7 oslokot
 
20.09.12
13:57
(3) да я упрощенно написал, как пример. А Вы сразу острить
8 Злопчинский
 
20.09.12
13:57
а) запртет изменения документов задним числом решит все ваши проблемы.
б) проведение заявки плюсут допрегистр, проведение Х - минусует допрегистр, при уходе в минус - стоп! документ Х включается в основную последовательность. при изменении заявки - а это будет сдвиг ГП - потребуется восстановление ГП - которое заткнется на проведении Х
в) варианты зависят от ЦЕЛЕВОГО назанчения документа Х.
9 Рэйв
 
20.09.12
13:57
(6)А какая разница?  У тебя на строки ссылок нет и совершенно пофигу будет старая там строка или свежесозданная.

А за писание в справочники можно и руки по локоть потерять.
10 acsent
 
20.09.12
13:57
(6) а чем отличается обновить от перезаполнить?
11 Злопчинский
 
20.09.12
13:58
(6) "служебные справочники" преврати в регистры. далее см. мой предыдущий пункт.
12 Светлый Гений
 
20.09.12
13:59
(11)это ж семерка
13 Злопчинский
 
20.09.12
13:59
(12) ну так и я семерочник...
14 ЧеловекДуши
 
20.09.12
14:00
(0)>>> GUID

Открою тебе секрет, DOCID (погугли, что это такое) уникально в пределе всей БД :)
Но это тебе не надо, хватит простой элементарной ссылки на подчиненный документ. Т.е. ты должен добавить реквизит "ДокументХ" в документ "Заявка покупателя" и при формировании подчиненного документ попросту записать его в документе "Заявка покупателя".
Всё это можно творить в момент проведения документа "Заявка покупателя", но я бы это делал в момент записи документа "Заявка покупателя".
15 Злопчинский
 
20.09.12
14:01
Если же документ Х выступает всего лишь второй ТЧ для заявки покупателя - при проведении заявки покупателя смотри данные из второй ТЧ. если изменения заявки критичные - стоп проведение с сообщением проблемы как разницы между текущим состоянием ТЧ заявки и ранее зафиксированным в Х
16 Злопчинский
 
20.09.12
14:03
> и при формировании подчиненного документ попросту записать его в документе "Заявка покупателя".
бяка, мну такое не нравится, когда хронологически более поздныий ДОКУМЕНТ что-то там правит в документе-родителе.
17 Злопчинский
 
20.09.12
14:04
(16) + как правило это недостатки выбранной схемы "учета" или отражения реальных бузинесс-процессов, связанное с тем что придется или свою конфу с нуля написать или натянуть кривое решение на типовую... ;-)
18 ЧеловекДуши
 
20.09.12
14:04
(16)Кто сказал, что-то правил?
Я вообще от автора топика так и не слышал, что делает документ Х и каков его функционал в дальнейшем :)
19 GLazNik
 
20.09.12
14:04
(14) эмъ... лучше наоборот. ссылку на заявку в ДокументХ... тогда будет корректно отрабатывать структура подчиненности
20 dk
 
20.09.12
14:04
алгоритм, обычно, ищут
а тут алгоритм решают ... ндя
21 ЧеловекДуши
 
20.09.12
14:05
(17)Зато очень хорошее решение для создания доп.табличной части на примере 8-ки :)
22 ЧеловекДуши
 
20.09.12
14:05
(20)Я бы сказал, что тут гадают на кофейной гуще :)
23 oslokot
 
20.09.12
14:05
(9) (10) В ТЧ документа "Х" есть поле "справочник", который является указателем на трам-пам-пам, долго объяснять... И мне нельзя его очищать при перезаполнении!
(14) нет, не секрет.
Документ "Х" действительно является лишь второй ТЧ заявки, только одно НО - строки "Х" не совпадают с заявкой, ибо сжаты при совпадающей номенклатуре
24 ЧеловекДуши
 
20.09.12
14:06
(19)Все дело во времени :)
Пока ты там найдешь нужный документ, у тебя пройдет драгоценные секунды :)
25 ЧеловекДуши
 
20.09.12
14:08
(23)Что бы все совпадало, ты должен искусственно придумать ИД(уник. идентификатор, к примеру простое, целое, число) для табличный частей.
И тогда ты всегда будешь знать, что где правили.
Потому что табличная часть документа "Заявка покупателя", может попросту быть перемешана самим пользователем :)
26 oslokot
 
20.09.12
14:08
(14) GUID? и?
27 oslokot
 
20.09.12
14:10
(25) да есть у меня GUID в табличных частях, толку то? Табличная часть "Х" может не совпадать с заявкой, не зеркало это (
28 Рэйв
 
20.09.12
14:11
(23)Что-то ты, имхо, какуюто хрень мудришь.
29 ЧеловекДуши
 
20.09.12
14:11
(26)Гуид это строка из 32-ух символов, полученная да для гуида чрезвычайно грубо :) (но все дело в скорости, уникальный гуид получается долго)
Нет, используй простой функционал:

МойИД = 1;

//След ИД
МойИД = МойИД + 1;

//И т.д. продолжаешь для каждой новой строчки
30 ЧеловекДуши
 
20.09.12
14:11
(27)Тогда зачем тебе это доп. табличное поле и что там содержится и для чего?
31 ILM
 
гуру
20.09.12
14:13
(0) Нужно смотреть на это как на систему с обратной связью.
32 ЧеловекДуши
 
20.09.12
14:13
+ "МойИД", должен быть реквизитов для документа "Заявка покупателя"
33 Злопчинский
 
20.09.12
14:14
(23) я выше написал! у меня есть точно такой же вариант где к реализации у меня творая ТЧ. при изменении реализации проведение реализации строится с учетом второй ТЧ. если изменения некритичные - то и ок. если изменения такие что вступают в противоречие со второй ТЧ - сообщение и /или стоп.
34 Злопчинский
 
20.09.12
14:15
(27) если есть алгоритм заполнения Х из заявки - то пусть там хоть мухи слоны будут - результат предсказуем и вопроизводим.
35 oslokot
 
20.09.12
14:22
(30) Постараюсь объяснить.
Поле, это простой справочник, "указатель" на справочник "Расшифровка". В справочник "Расшифровка" заносятся сведения о номенклатуре из табличной части документа "Х"
Опустим справочники, хрен с ними.

Пример: если в заявке была замена одной номенклатуры на другую, то мне нужно НАЙТИ в табличной части "Х" эту же номенклатуру и поменять ее. Но где гарантия, что я ее правильно найду даже по идентификатору, если табличная часть "Х" сжата по совпадающей номенклатуре?
36 oslokot
 
20.09.12
14:26
"Заявка":
1.Хлеб 1 шт
2.Хлеб 1 шт
3.Хлеб 1 шт
4.Молоко 2 шт

После заполнения в документе "Х":
1.Хлеб 3 шт
2.Молоко 2 шт

Теперь меняем в заявке позицию №2 на Яйцо
Мне нужно чтобы в "Х" стало так:
1.Хлеб 2 шт
2.Молоко 2 шт
3.Яйцо 1 шт

Доступно объяснил?
37 ЧеловекДуши
 
20.09.12
14:28
(35)Читай внимательно (29) с реквизитом "МойИД".
И много думать и будет у тебя счастье :)
38 ЧеловекДуши
 
20.09.12
14:30
(36)Накой ты сворачиваешь табличную часть документаХ ?
Это глупо. Ведь этот документ не доступен пользователю и там должны содержаться данные так, как твоей программистской душонки потребно :)
39 ЧеловекДуши
 
20.09.12
14:31
+(36) Теперь меняем в заявке позицию №2 на Яйцо
Мне нужно чтобы в "Х" стало так:

1.Хлеб 2 шт
2.Молоко 2 шт
3.Яйцо 1 шт

Да... я тебя понял, "Дятел птица гордая...", ответы кончались, есть только диагноз :)
40 oslokot
 
20.09.12
14:33
(38) конечно глупо! но такая уж задача передо мной стоит, сам знаю что это дурость несусветная. Но надо блин ее сворачивать, без этого никак. Мы просто раскидываем запросы одинаковых позиций по сотне поставщиков...
41 Злопчинский
 
20.09.12
14:40
ПриЗаписи()
НайтиВПодчиненныхНужныйДокХ.
ВыгрузитьТабличнуючасть(ТЗ)
ТЗ.Свернуть(...)
ДокХ.ЗагрузитьТабличнуюЧасть(ТЗ)
42 Злопчинский
 
20.09.12
14:41
(40) как-то вы извините мудачно раскид одинаоквых позиций по стоне поставщиков делаете. в свое время заявки на тысячу строк раскидывал по 10-ку поставщиков - обошелся типовым функционалом + обработки-обертки
43 Злопчинский
 
20.09.12
14:42
(41) + вообще-то это надо делать в процедуре ПослеУспешнойЗаписи(), ибо будут рассогласования данных.
44 Злопчинский
 
20.09.12
14:43
и вообще непонятно. если докХ так просто получается из заявки - НАКУА ОН ВООБЩЕ НУЖЕН! там где нужен докХ - обращайся к заявке и вытягивай данные из нее...
45 oslokot
 
20.09.12
14:49
(41-44) Документ нужен для отправки запросов поставщикам и получением от них ответов и последующей их регистрации. Заявкой это точно не решить.
Регистрация состояния запрос-ответ записывается в справочник "Расшифровка", который в свою очередь прикреплен к табличной части док-а "Х".
Именно поэтому мне нельзя очищать таблицу при обновлении (41)
46 oslokot
 
20.09.12
14:50
Просто скажите, такое возможно как описано в (36) или нет?
Если даже теоретически нет, закрываем тему
47 DigitalDolphin
 
20.09.12
14:58
Подожди. А зачем  отдельно справочник. Что там храниться. Ну если каждый элемент справочника подвязан просто под номенклатуру.. то зачем он?
48 DigitalDolphin
 
20.09.12
14:59
Зачем точнее хранить в каждой строке связку?
49 DigitalDolphin
 
20.09.12
15:01
(46) Просто  так не скажешь можно/нельзя. Конкретика задачи и показывает есть параметры на которые можно и вообще нужно опираться при написании алгоритма или нет.
50 DigitalDolphin
 
20.09.12
15:03
Вообще из того что я понял. Я бы лучше сделал регистр. Измерения: докХ, товар ресурс: ЕстьОтвет. И  туда уже фугавал
51 oslokot
 
20.09.12
15:05
(47) не под номенклатуру, а к строке таблицы "Х"
Допустим мы запросили цены на Хлеб у 10 поставщиков.
Ткнули дважды на Хлеб в таблице док-а "Х"
Создалось 10 элементов справочника "Расшифровка" с именами поставщиков для хранения в них всяческой другой инфы, например ответы от них, условия поставки и т.п.
А так же создался указатель который привязал к строке таблицы все эти 10 элементов расшифровки (ну чтоб потом можно было их найти)
52 oslokot
 
20.09.12
15:07
(50) да, я бы так же сделал. поздно уже. Механизм работает давно, не хочется ломать.
Просто сейчас понадобилась волшебная кнопка "Обновить" на документе "Х"
53 DigitalDolphin
 
20.09.12
15:12
Ну в этом случае да лучше справочником. Потому что при отмене проведения пропали бы и записи :-)
Но я не привязывал бы в документе элемент. Нет смысла. Просто в справочнике делаешь еще одно поле ДокХ и в него записываешь ссылку на док. А когда нужно получить информацию фильтруешь по этому полю и получаешь нужные позиции. Находишь нужный элемент номенклатуры. И не нужно привязки в строке
54 DigitalDolphin
 
20.09.12
15:15
А вообще я тоже подобное делал. Фирма специализировалась на продаже под заказ. И там все было на этом. Заявка - поиск поставщиков. Ну я там все реализовал в одном документе. Просто было несколько табличных частей виртуальных :=)
55 oslokot
 
20.09.12
15:20
(54) вот-вот, у меня в этом доке куча закладок с именем поставщика и под них виртуалок
56 DigitalDolphin
 
20.09.12
15:23
ну думаю если не хочешь сильно переделывать. Просто добавь в справочник нужные поля. И при заполнении каждой таблицы фильтруй справочник и выводи в них
57 oslokot
 
20.09.12
16:25
(56) угу, пытаюсь..
Спасибо!
58 ILM
 
гуру
20.09.12
17:40
(57) Вообще не добавляй, выводи так.
59 ADirks
 
21.09.12
07:35
(36) достаточно нередкая задача, чего сложного то?

тзТЧ = СоздатьОбъект("ТаблицаЗначений");
Заявка.ВыгрузитьТабличнуюЧасть(тзТЧ, "Товар, Количество");
тзТЧ.Свернуть("Товар", "Количество");
итТЧ = СоздатьОбъект("ИндексированнаяТаблица");
итТЧ.Загрузить(тзТЧ);

итТЧх = СоздатьОбъект("ИндексированнаяТаблица");
итТЧх.Загрузить(ДокХ, "Товар, Количество, СправочникХ");
итТЧх.ДобавитьИндекс("иТовар", "Товар*");

итТЧ.ЛевоеСоединение("Товар", итТЧх, "иТовар", "СправочникХ");
итТЧ.Выгрузить(ДокХ);


можно и без ИТ, но лень, мысль думаю понятна и так
60 oslokot
 
21.09.12
10:54
(59) Спасибо!
ИндексированнаяТаблица это в 1срр?
61 DigitalDolphin
 
21.09.12
11:01
Да ну я считаю тут можно вполне обойтись штатными средствами. Все равно значения хранить надо. Справочник все равно уже есть. Больше в задаче и не требуется.
62 ADirks
 
21.09.12
11:12
да в общем, не надо там ИТ. Это я так, не шибко проснулся ещё. Ну а так да, 1cpp

тзТЧ = СоздатьОбъект("ТаблицаЗначений");
Заявка.ВыгрузитьТабличнуюЧасть(тзТЧ, "Товар, Количество");
тзТЧ.Свернуть("Товар", "Количество");
тзТЧ.НоваяКолонка("СправочникХ", "Справочник.Х");

тзТЧх = СоздатьОбъект("ТаблицаЗначений");
ДокХ.ВыгрузитьТабличнуюЧасть(тзТЧх, "Товар, СправочникХ");

тзТЧх.ВыбратьСтроки();
Пока тзТЧх.ПолучитьСтроку() = 1 Цикл
   Если НайтиСтрокуТЗ(тзТЧ, "Товар", тзТЧх.Товар) = 1 Тогда
       тзТЧ.СправочникХ = тзТЧх.СправочникХ;
   Иначе
       спрХ = СоздатьОбъект("Справочник.Х");
       спрХ.Новый();
       ...
       спрХ.Записать();
       тзТЧ.СправочникХ = спрХ.ТекущийЭлемент();
   КонецЕсли;
КонецЦикла;
ДокХ.ЗагрузитьТабличнуюЧасть(тзТЧ);
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс