Перейти к содержимому


Услуги программиста 1С
Профессиональные программисты 1С.
Весь комплекс услуг сопровождения 1С.

Курсы 1С
Бухгалтерам, менеджерам
и программистам.
Бесплатно!
Живое индивидуальное обучение по 1С.

З ТЗ вибрати не всі значення


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 18

#1   Lighta

Lighta

      Лейтенант

    • Пользователи
    • PipPip
    • Сообщений: 71
    • Регистрация: 04-March 10
    • Откуда:Ровно , Ровенская Область , Украина

Отправлено 07 October 2010 - 13:20

На формі при натисненні кнопки формується ТЗ з якої вибирається накладна і потім заноситья в реквізит, в списку може бути декілька накладних, але треба вибирати наприклад не всі, методом ВибратьСтроки не підійде, також не дуже хочеться кілька разів нажимати на вибор накладної і зганяти ВСтрокуСРазделителями, як зробити щоб при відкритому ТЗ кілька накладних вибрати.

Code
ном=0;
Если ТЗ.ВыбратьСтроку(ном,"Выбор накладных")=1 Тогда
  ТЗ.ПолучитьСтрокуПоНомеру(ном);
  Накл = ТЗ.НомерНакладной;
  НомерНакл = ТЗ.НомерНакл;
  Кво = ТЗ.Кво;    
КонецЕсли;
dry
  • 0

#2   takefive

takefive

      Подполковник

    • Пользователи
    • PipPipPipPipPip
    • Сообщений: 125
    • Регистрация: 16-November 07
    • Откуда:Днепропетровск

Отправлено 07 October 2010 - 13:51

1. добавить в ТЗ колонку и нарисовать там флажки...
2. нарисовать на форме еще одну таблицу для для выбранных значений
3. сделать как в множественном подборе
  • 0

#3   Lighta

Lighta

      Лейтенант

    • Пользователи
    • PipPip
    • Сообщений: 71
    • Регистрация: 04-March 10
    • Откуда:Ровно , Ровенская Область , Украина

Отправлено 07 October 2010 - 14:22

Моя ТЗ є віртуальною, і мені здається іі невідредагувати cool , да і данні треба "заганяти" в строку
  • 0

#4   takefive

takefive

      Подполковник

    • Пользователи
    • PipPipPipPipPip
    • Сообщений: 125
    • Регистрация: 16-November 07
    • Откуда:Днепропетровск

Отправлено 07 October 2010 - 15:22

Можете вызвать внешнюю обработку...
Code

Процедура ВыборИзСписка()
  ЗначениеВыбора = СоздатьОбъект("СписокЗначений");
  ЗначениеВыбора.ДобавитьЗначение(ВыбНачПериода,"ВыбНачПериода");
  ЗначениеВыбора.ДобавитьЗначение(ВыбКонПериода,"ВыбКонПериода");
  ЗначениеВыбора.ДобавитьЗначение(ВыбКонтрагент,"ВыбКонтрагент");
  ОткрытьФормуМодально("Отчет",ЗначениеВыбора,ПутьКВнешнейОбработке);
  МойРеквизит = ЗначениеВыбора.ВСтрокуСРазделителями();
КонецПроцедуры

ТЗ разместите на форме внешней обработки
Code
Перем СписокОтбора;

Процедура ЗаполнитьТЗ()
  СписокОтбора = Форма.Параметр;
  ВыбНачПериода = СписокОтбора.Получить("ВыбНачПериода");
  ВыбКонПериода = СписокОтбора.Получить("ВыбКонПериода");
  ВыбКонтрагент = СписокОтбора.Получить("ВыбКонтрагент");
  СписокОтбора.УдалитьВсе();
  Запрос = СоздатьОбъект("Запрос");
  ТекстЗапроса = "
  |Период с ВыбНачПериода по ВыбКонПериода;
  |Накладная = Документ.НалоговаяНакладная.ТекущийДокумент;
  |Контрагент = Документ.НалоговаяНакладная.Контрагент;
  |Группировка Накладная;
  |Условие(Контрагент в ВыбКонтрагент);";
  Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
   Возврат;
  КонецЕсли;
  Запрос.Выгрузить(ТЗ,,0);
КонецПроцедуры

Процедура Выбор()
  Если ТЗ.ТекущаяСтрока() <> 0 Тогда
   Выбор = ТЗ.ПолучитьЗначение(ТЗ.ТекущаяСтрока(),"Накладная");
   Если СписокОтбора.Принадлежит(Выбор) = 0 Тогда
    СписокОтбора.ДобавитьЗначение(Выбор, "Выбор");
   КонецЕсли;
  КонецЕсли;
КонецПроцедуры

ЗаполнитьТЗ();

  • 0

#5   Lighta

Lighta

      Лейтенант

    • Пользователи
    • PipPip
    • Сообщений: 71
    • Регистрация: 04-March 10
    • Откуда:Ровно , Ровенская Область , Украина

Отправлено 08 October 2010 - 08:45

Процедуру Выбор() повісила на ТЗ, і не працює, крім того МойРеквизит = ЗначениеВыбора.ВСтрокуСРазделителями(); видає помилку поле агрегатного обєкта не обнаружено (ВСтрокуСРазделителями)
  • 0

#6   takefive

takefive

      Подполковник

    • Пользователи
    • PipPipPipPipPip
    • Сообщений: 125
    • Регистрация: 16-November 07
    • Откуда:Днепропетровск

Отправлено 08 October 2010 - 09:10

Попробуйте это
Code

Перем СписокВыбранныхЗначений;

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

Процедура ПереносЗначенийВМойРеквизит()  
  МойРеальноСуществующийНаФормеРеквизит = СписокВыбранныхЗначений.ВСтрокуСРазделителями();
КонецПроцедуры

СписокВыбранныхЗначений = СоздатьОбъект("СписокЗначений");

  • 0

#7   Lighta

Lighta

      Лейтенант

    • Пользователи
    • PipPip
    • Сообщений: 71
    • Регистрация: 04-March 10
    • Откуда:Ровно , Ровенская Область , Украина

Отправлено 08 October 2010 - 09:33

А чим відрізняються ці два коди, щось я різниці ніякої небачу, чи я туплю
  • 0

#8   takefive

takefive

      Подполковник

    • Пользователи
    • PipPipPipPipPip
    • Сообщений: 125
    • Регистрация: 16-November 07
    • Откуда:Днепропетровск

Отправлено 08 October 2010 - 09:59

1 код для внешней обработки передает в форму параметр. Внешняя форма возвращает результат. т.е. для работы с двумя формами

Добавлено (08.10.2010, 10:55)
---------------------------------------------

Quote (Lighta)
МойРеквизит = ЗначениеВыбора.ВСтрокуСРазделителями(); видає помилку поле агрегатного обєкта не обнаружено (ВСтрокуСРазделителями)

тип переменной "ЗначениеВыбора" не равно "СписокЗначений"

Добавлено (08.10.2010, 10:59)
---------------------------------------------
Скорее всего вы пытаеетесь получить не оттуда, куда добавляеете

  • 0

#9   Lighta

Lighta

      Лейтенант

    • Пользователи
    • PipPip
    • Сообщений: 71
    • Регистрация: 04-March 10
    • Откуда:Ровно , Ровенская Область , Украина

Отправлено 08 October 2010 - 10:19

По отладчіку пройшлась, в СписокОтбора зовн. обработкі записує дані, а як передати цей список на потрібну форму?
  • 0

#10   takefive

takefive

      Подполковник

    • Пользователи
    • PipPipPipPipPip
    • Сообщений: 125
    • Регистрация: 16-November 07
    • Откуда:Днепропетровск

Отправлено 08 October 2010 - 10:32

Форма.Параметр = СписокОтбора
  • 0

#11   Lighta

Lighta

      Лейтенант

    • Пользователи
    • PipPip
    • Сообщений: 71
    • Регистрация: 04-March 10
    • Откуда:Ровно , Ровенская Область , Украина

Отправлено 08 October 2010 - 10:46

Форма.Параметр = СписокОтбора пишу в потрібній формі а після МійреквізитНаФормі = СписокОтбора.ВСтрокуСРазделителями();
всеодно помилка поле агрегатного обєкта не обнаружено (ВСтрокуСРазделителями)
  • 0

#12   takefive

takefive

      Подполковник

    • Пользователи
    • PipPipPipPipPip
    • Сообщений: 125
    • Регистрация: 16-November 07
    • Откуда:Днепропетровск

Отправлено 08 October 2010 - 11:04

Code
  ОткрытьФормуМодально("Отчет",ЗначениеВыбора,ПутьКВнешнейОбработке);  
   МойРеквизит = ЗначениеВыбора.ВСтрокуСРазделителями();

ЗначениеВыбора доступен в форме выбора как Форма.Параметр
В этом списке я передаю значения для отбора в запросе в форме выбора. После формирования запроса (ТЗ) я этот спиок очищаю и в него же добавляю значения выбора. После закрытия формы выбора в переменной ЗначениеВыбора содержатся - догадайтесь с 3 раз smile

Добавлено (08.10.2010, 12:04)
---------------------------------------------
Действующий пример: Download Test.zip for free on uploading.com

  • 0

#13   Lighta

Lighta

      Лейтенант

    • Пользователи
    • PipPip
    • Сообщений: 71
    • Регистрация: 04-March 10
    • Откуда:Ровно , Ровенская Область , Украина

Отправлено 08 October 2010 - 11:50

Дякую за приклад наглядний, зрозуміла що зробила не правильно, вроді було все так написано, але форму відкривала не модально а просто ОткрытьФорму, напевно так не можна параметр передати, а можна два списка значень передати через форма параметр? Бо мені треба заповнити 2 реквізити
  • 0

#14   takefive

takefive

      Подполковник

    • Пользователи
    • PipPipPipPipPip
    • Сообщений: 125
    • Регистрация: 16-November 07
    • Откуда:Днепропетровск

Отправлено 08 October 2010 - 13:34

Мы передаем список, который сам по себе может содержать не один элемент. И кроме того элементами списка может быть что угодно: ТаблицаЗначений, СписокЗначений. Если учесть что Элемент списка имеет Значение и Представление уже одним элементом списка можно передать 2 значения. Как видите, Ваши возможности почти безграничны...
  • 0

#15   Lighta

Lighta

      Лейтенант

    • Пользователи
    • PipPip
    • Сообщений: 71
    • Регистрация: 04-March 10
    • Откуда:Ровно , Ровенская Область , Украина

Отправлено 08 October 2010 - 13:42

Але як передати через список наприклад таблицю значень з 3-х колонок, воно ж в списку не розрізнить де яка колонка.
А як строку реквізита перевірити з списком який вибираєм, бо при повторному відкритті і не вибравши нічого реквізит пустий.
  • 0

#16   takefive

takefive

      Подполковник

    • Пользователи
    • PipPipPipPipPip
    • Сообщений: 125
    • Регистрация: 16-November 07
    • Откуда:Днепропетровск

Отправлено 08 October 2010 - 14:36

ОткрытьФормуМодально("Отчет",ЗначениеВыбора,ПутьКВнешнейОбработке);
// Если мы открываем модально - дальнейший код не обрабатывается до закрытия формы
МойРеквизит = ЗначениеВыбора.ВСтрокуСРазделителями();

Добавлено (08.10.2010, 15:23)
---------------------------------------------
Вот пример немодального подбора значений

Code
Процедура ВыборИзСписка()
   //Передаем в форму выбора контекст формы приемника - эту форму
   ОткрытьФорму("Отчет",Контекст,ПутьКОбработке);
КонецПроцедуры

форма подбора еще проще. Не возвращаем параметр а добавляем непосредственно на форму
Code
Процедура ПриОткрытии()
   //Отборы для запроса получаем напрямую с формы приемника
   Приемник = Форма.Параметр;
   ВыбНачПериода = Приемник.ВыбНачПериода;
   ВыбКонПериода = Приемник.ВыбКонПериода;
   ВыбКонтрагент = Приемник.ВыбКонтрагент;
   Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса = "
   |Период с ВыбНачПериода по ВыбКонПериода;
   |Накладная = Документ.НалоговаяНакладная.ТекущийДокумент;
   |Контрагент = Документ.НалоговаяНакладная.Контрагент;
   |Группировка Накладная;
   |Условие(Контрагент в ВыбКонтрагент);";
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат;
   КонецЕсли;
   Запрос.Выгрузить(ТЗ,,0);
КонецПроцедуры

Процедура Выбор()
   Если ТЗ.ТекущаяСтрока() <> 0 Тогда
    Выбор = ТЗ.ПолучитьЗначение(ТЗ.ТекущаяСтрока(),"Накладная");
    Приемник = Форма.Параметр;
    Если Приемник.ВыбДокументы.Принадлежит(Выбор) = 0 Тогда
     //Добавляем на форму приемника. значения появляются сразу после выбора
     Приемник.ВыбДокументы.ДобавитьЗначение(Выбор);
    КонецЕсли;
   КонецЕсли;
КонецПроцедуры

Добавлено (08.10.2010, 15:36)
---------------------------------------------
Модально тоже будет работать


#17   Lighta

Lighta

      Лейтенант

    • Пользователи
    • PipPip
    • Сообщений: 71
    • Регистрация: 04-March 10
    • Откуда:Ровно , Ровенская Область , Украина

Отправлено 11 October 2010 - 09:24

Ну да відкривши форму не модально добавляє значення, але у мене реквізит в який треба добавити є строчкою, таким чином 2342, 34522, 35455. Як порівняти строчку з одним значенням? і щоб добавлялось до існуючої строки нове значення?
Code
Если (Найти(СписокОтбора.накладная,Выбор) = 0) Тогда
   СписокОтбора.накладная =СписокОтбора.накладная +","+ Выбор;
КонецЕсли;

Так не добавляє. Зрозуміла свою помилку, мій реквізит заповнюється пробілами і тому не може нове значення добавити,просто треба було добавити СокрЛП. cool Але як зробити щоб при виборі відразу відображались дані, а то зараз при закритті і відкритті обробки?
  • 0

#18   takefive

takefive

      Подполковник

    • Пользователи
    • PipPipPipPipPip
    • Сообщений: 125
    • Регистрация: 16-November 07
    • Откуда:Днепропетровск

Отправлено 11 October 2010 - 10:25

Опять же может быть много вариантов... как один из вариантов
1.Получаем с формы строковый реквизит
2.Преобразуем его в список
3.Проверяем полученный список на вхождение значения
4.Если значение не в списке Добавляем, Преобразуем список в строку, Строку ложим на место - в реквизит формы
  • 0

#19   Lighta

Lighta

      Лейтенант

    • Пользователи
    • PipPip
    • Сообщений: 71
    • Регистрация: 04-March 10
    • Откуда:Ровно , Ровенская Область , Украина

Отправлено 11 October 2010 - 13:05

вирішилось таким образом:
Code
Если Найти(СписокОтбора.МойРекв,Накладная) = 0 Тогда
    Если ПустоеЗначение(СписокОтбора.МойРекв)=1 Тогда
     СписокОтбора.МойРекв = Накладная;
    Иначе
     СписокОтбора.МойРекв =СокрЛП(СписокОтбора.МойРекв) +","+ Накладная;
    КонецЕсли;
    СписокОтбора.Форма.Обновить();
КонецЕсли;

З мене + для takefive,

Добавлено (11.10.2010, 14:05)
---------------------------------------------
Вирішилось таким кодом:

Code
Если Найти(СписокОтбора.МойРек,Накладная) = 0 Тогда
    Если ПустоеЗначение(СписокОтбора.МойРек)=1 Тогда
     СписокОтбора.МойРек = Накладная;
    Иначе
     СписокОтбора.МойРек =СокрЛП(СписокОтбора.МойРек) +","+ Накладная;
    КонецЕсли;
     
    СписокОтбора.Форма.Обновить();
КонецЕсли;

З мене + для takefive biggrin


Обратно в Программирование и конфигурирование 1С Предприятия 7.7


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных