Курилка ТаблицаЗначений

Тема в разделе "Курилка", создана пользователем Leisan, 5 мар 2013.

  1. TopicStarter Overlay
    Leisan
    Offline

    Leisan

    Регистрация:
    4 апр 2012
    Сообщения:
    35
    Симпатии:
    0
    Баллы:
    1
    Всем привет. буду признательна если попишите и вспомните 1с 7.7, как работать с таблицей значения если есть список в котором есть одинаковое количество документов 2-ух видов, которые ничем не связаны кроме общей ценой, и конечному пользователю надо чтобы этот список из 2 столбцового (столбец с датой и номером можно упустить) превратился в 4 столбцовый (исходный список прикреплен). и напротив каждой цены из документа оприходования стоял документ перемещение с такой же ценой.жду ответов и решений.

    Вложения:

    • rybuf1.txt
      Размер файла:
      840 байт
      Просмотров:
      38
  2. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    Попробуйте так:
    Код:
    ТЗПриход.НоваяКолонка("ДокПеремещения", "Документ.ПеремещениеТовара");
    ТЗПриход.НоваяКолонка("ЦенаПеремещения", "Число", 15, 2);
    ТЗПриход.ВыбратьСтроки();
    Пока ТЗПриход.ПолучитьСтроку() = 1 Цикл
    ТЗПеремещение.ВыбратьСтроки();
    Пока ТЗПеремещение.ПолучитьСтроку() = 1 Цикл
    Если ТЗПриход.Цена = ТЗПеремещение.Цена Тогда
    ТЗПриход.ДокПеремещения = ТЗПеремещение.Документ;
    ТЗПриход.ЦенаПеремещения = ТЗПеремещение.Цена;
    
    ТЗПеремещение.УдалитьСтроку(ТЗПеремещение.НомерСтроки);
    Прервать;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
    
    Имена переменных и колонок свои подставите.
  3. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Не получится...
    Если внутри цикла выборки "ТЗПеремещение" удалять строки из этой же таблицы, то будут некоторые строки пропущены.
    Честно говоря не вижу вообще проблемы:
    1. Создаем ТЗ с четырьмя колонками
    2. Перебираем исходную ТЗ
    2.1. Если вид документа "Оприходование товара", то в итоговую таблицу добавляем строку
    2.2. Если вид документа "Перемещение товара", то в итоговой таблице ищем цену и дополняем найденную строку

    Другой вариант:
    1. В исходной ТЗ добавляем колонку
    2. Сортируем ТЗ по цене
    3. Перебираем строки ТЗ по индексу
    3.1 Берем из строки [Индекс + 1] и дописываем в текущую строку
    3.2 Удаляем строку [Индекс + 1] и переходим к следующей строке

    Вариантов может быть масса, ведь неизвестны ограничивающие условия. [off]ИМХО подбирать документы по какому-то числовому полю - это не правильно[/off]
  4. TopicStarter Overlay
    Leisan
    Offline

    Leisan

    Регистрация:
    4 апр 2012
    Сообщения:
    35
    Симпатии:
    0
    Баллы:
    1
    а в вашем случае точно не появляется пустых строк? есть 2 документа с одинаковыми ценами, как обойти?

    есть 2 документа с одинаковыми ценами, как обойти? и не получить пустых строк, и пустых ячеек тоже
  5. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Вот именно по этому я и написал, что такой вариант в корне не верный, поэтому нет смысла его рассматривать.

    К тому же это только наброски, что бы понять ход мысли... и, разумеется, необходимо все это продумывать, подстраивать и т.д. Если все это нужно сделать за вас, то попробуйте найти программиста, и поставить ему конкретную задачу.
  6. TopicStarter Overlay
    Leisan
    Offline

    Leisan

    Регистрация:
    4 апр 2012
    Сообщения:
    35
    Симпатии:
    0
    Баллы:
    1
    а модератор 7.7 это что просто картинка, да? и вы не непрограммист?напишите мне код и все, ваш ход мысли в нем я пойму!
  7. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    Вам здесь никто ничего не обязан писать. Сам алгоритм описан в сообщении №3.
  8. TopicStarter Overlay
    Leisan
    Offline

    Leisan

    Регистрация:
    4 апр 2012
    Сообщения:
    35
    Симпатии:
    0
    Баллы:
    1
    Ну почему Вы меня как то не адекватно воспринимаете, я не говорю что вы обязаны, и я ничего не требую, просто прошу помощи. я хочу сказать что предложенные алгоритмы не подходят если в 2-х документах, одного вида,одинаковые цены, как обойти???
  9. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    А как еще прикажете понять вашу фразу? Мне кажется ее нельзя толковать двояко.
  10. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Услуга платная. Предложения жду в личке. Заранее предупреждаю - стою дорого.

    В своем первом посте я писал (да и во втором тоже), что ЭТО В КОРНЕ НЕ ПРАВИЛЬНО!
    Все эти "обойти" - это временные костыли, которые постоянно придется допиливать. Поэтому, ищите другие варианты.

    Далее разговор в данном ключе буду считать флеймом - тему закрою и всех накажу :D
  11. TopicStarter Overlay
    Leisan
    Offline

    Leisan

    Регистрация:
    4 апр 2012
    Сообщения:
    35
    Симпатии:
    0
    Баллы:
    1
  12. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    полностью согласен с WaRDeR. Изначально "кривая" задача. Попытка синхронизировать по ценам говорит о недостаточном знании конфигурации. (Временная таблетка)
  13. Vlan
    Offline

    Vlan Гость Гость

    Не флейма ради, а тренировки для
    попробовал решить эту задачу с таблицей значений.
    Для простоты я принял, что количество документов и цифры в них полностью идентичны. "Защиту от дурака" можно добавить по вкусу.
    Вот что у меня получилось:

    Код:
    //*******************************************
    Процедура ДобавитьВтаблицу(Имя,Цена)
    тЗнач.НоваяСтрока();
    тЗнач.Имя = Имя;
    тЗнач.Цена = Цена;
    КонецПроцедуры
    //*******************************************
    Процедура Сформировать()
    тЗнач = СоздатьОбъект("ТаблицаЗначений");//Заполнение исходными данныыми таблицы значений
    тЗнач.НоваяКолонка("Имя");
    тЗнач.НоваяКолонка("Цена");
    тЗнач.НоваяКолонка("Имя2");
    тЗнач.НоваяКолонка("Цена2");
    ДобавитьВтаблицу("Оприходование товара",100);
    ДобавитьВтаблицу("Оприходование товара",200);
    ДобавитьВтаблицу("Оприходование товара",300);
    ДобавитьВтаблицу("Оприходование товара",400);
    ДобавитьВтаблицу("Оприходование товара",500);
    ДобавитьВтаблицу("Оприходование товара",100);
    ДобавитьВтаблицу("Оприходование товара",600);
    ДобавитьВтаблицу("Оприходование товара",650);
    ДобавитьВтаблицу("Оприходование товара",200);
    ДобавитьВтаблицу("Оприходование товара",301);
    ДобавитьВтаблицу("Оприходование товара",700);
    ДобавитьВтаблицу("Перемещение товара",100);
    ДобавитьВтаблицу("Перемещение товара",600);
    ДобавитьВтаблицу("Перемещение товара",200);
    ДобавитьВтаблицу("Перемещение товара",200);
    ДобавитьВтаблицу("Перемещение товара",300);
    ДобавитьВтаблицу("Перемещение товара",301);
    ДобавитьВтаблицу("Перемещение товара",400);
    ДобавитьВтаблицу("Перемещение товара",500);
    ДобавитьВтаблицу("Перемещение товара",100);
    ДобавитьВтаблицу("Перемещение товара",650);
    ДобавитьВтаблицу("Перемещение товара",700);//Закончили
    //*******************************************
    // Непосредственно начало преобразований
    тЗнач.Сортировать("Имя,Цена"); //Отсортируем по виду и цене
    Стр = тЗнач.КоличествоСтрок();
    Смещение = Стр/2; //Ровно половина таблицы
    Имя = "";
    Цена = 0;
    Пока Стр > 0 Цикл
    тЗнач.ПолучитьСтрокуПоНомеру(Стр);
    Если тЗнач.Имя <> "Оприходование товара" Тогда //Нас интересует только Перемещение
    Имя = тЗнач.Имя;
    Цена = тЗнач.Цена;
    тЗнач.УстановитьЗначение(Стр-Смещение,"Имя2",Имя); //Устанавливаем данные в ту половину таблицы, где Оприходование
    тЗнач.УстановитьЗначение(Стр-Смещение,"Цена2",Цена);
    тЗнач.УдалитьСтроку(Стр);
    КонецЕсли;
    Стр = Стр - 1;
    КонецЦикла;
    тЗнач.ВыбратьСтроки(); //Выводим получившуюся таблицу для проверки
    Пока тЗнач.ПолучитьСтроку() = 1 Цикл
    Сообщить(Строка(тЗнач.Имя)+" "+Строка(тЗнач.Цена)+" "+Строка(тЗнач.Имя2)+" "+Строка(тЗнач.Цена2));
    КонецЦикла;
    КонецПроцедуры
    
  14. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    И какой результат? Код настрочить не проблема. Вопрос ведь в том, как определить связи, если сумма совпадает?
  15. Vlan
    Offline

    Vlan Гость Гость

    Результат именно тот, который нужен топикстартеру - 4 колонки с разложенными по цене документами вне зависимости от последовательности строк в таблице. Связи ему нужны только по цене. Можно расширить функционал - добавить проверку цены в устанавливаемой строке и, скажем, даты (перемещение не может быть ранее приходования). Это уж пусть он(а) сам(а) лоб морщит.
  16. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    Если количество оприходований не равно количеству перемещений?
    Есть цена оприходования которой нет в перемещении.

    Слишком уж "шаткий" алгоритм
  17. Vlan
    Offline

    Vlan Гость Гость

    Насколько я понял, задача и состоит, чтобы выяснить, соответствует ли количество перемещений количеству оприходований. Достаточно получить первое же несоответствие, чтобы остановить обработку и выдать соответствующее предупреждение.
  18. Vlan
    Offline

    Vlan Гость Гость

    Вот вариант, не зависящий от количества документов и соответствия цены:

    Код:
    // Непосредственно начало преобразований
    тЗнач.Сортировать("Имя,Цена"); //Отсортируем по виду и цене
    Стр = тЗнач.КоличествоСтрок();
    Имя = "";
    Цена = 0;
    Пока Стр > 0 Цикл
    тЗнач.ПолучитьСтрокуПоНомеру(Стр);
    Если тЗнач.Имя <> "Оприходование товара" Тогда //Нас интересует только Перемещение
    Имя = тЗнач.Имя;
    Цена = тЗнач.Цена;
    Ошибка = 1;
    сч = Стр - 1;
    Пока сч > 0 Цикл
    тЗнач.ПолучитьСтрокуПоНомеру(сч);
    Если ((тЗнач.Имя = "Оприходование товара")
    И   (тЗнач.Цена  = Цена)
    И (ПустоеЗначение(тЗнач.Имя2) = 1))
    Тогда
    Ошибка = 0;
    тЗнач.УстановитьЗначение(сч,"Имя2",Имя); //Устанавливаем данные в ту половину таблицы, где Оприходование
    тЗнач.УстановитьЗначение(сч,"Цена2",Цена);
    тЗнач.УдалитьСтроку(Стр);
    Прервать;
    КонецЕсли;
    сч = сч - 1;
    КонецЦикла;
    Если Ошибка = 1 Тогда
    Сообщить("Для Перемещения с ценой "+Строка(Цена) + " нет соответствия!");
    КонецЕсли;
    КонецЕсли;
    Стр = Стр - 1;
    КонецЦикла;
    
  19. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Надеюсь, автора топика мы все же убедили, что так делать нельзя, и все, что пойдет далее, это оффтоп и чисто спортивный интерес.
    За сим переношу тему в курилку, и можем продолжить :D

    По последнему алгоритму - прямой перебор, конечно, это вариант, но самый самый не оптимальный. Веселее было бы сначала выполнить сортировку ТЗ, а потом с ней работать.

    Так же с ходу вижу косяк - строки перебираются снизу вверх, сначала находится перемещение, а потом для него перебираются приходы, все что выше. То есть все приходы ниже обрабатываемого перемещения обработаны не будут?

    Свой вариант, который считаю оптимальным, описан в сообщении #3 (вариант 2)
  20. Vlan
    Offline

    Vlan Гость Гость

    Как же я сам-то не догадался???? Вот тупой! Просто так вставил сортировку первой строкой, безо всякой необходимости. :)
    Нет там косяков, я проверил, прежде чем постить. "Ниже" прихода быть не может в принципе.

Поделиться этой страницей