Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Загрузка данных в документ
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
Vladimir1C
Добрый день!
Не могу решить проблему с загрузкой данных в документ(в даном случае документ СписаниеТМЦ) .
Требуется из обработки заполнить документ товарами из файла.
Как работать с файлом не вопрос...как поладить с документом:
    Конт=0;    
    результат = ОткрытьФорму("Документ.СписаниеТМЦ",Конт);

этим кодом я открываю форму нового документа из обработки,
а как можно её заполнить списком материала??
Т.е. необходимо получить ссылку на документ что бы до открытия формы заполнить его или
после. Кроме контекста формы у меня ничего нет...
Vofka
Зачем получать, отркывая форму? Если надо заполнить и показать - сначала я бы заполнил, а потом открыл форму (если надо). Из контекста формы я уже не помню можно ссылку получить или нет.
kalyamov
Цитата(Vladimir1C @ 01.07.11, 7:53) необходимо зарегистрироваться для просмотра ссылки
Добрый день!
Не могу решить проблему из загрузкой данных в документ(в даном случае документ СписаниеТМЦ) .
Требуется из обработки заполнять документ товарами из файла.
Как работать из файлом не вопрос...как поладить из документом:
    Конт=0;    
    результат = ОткрытьФорму("Документ.СписаниеТМЦ",Конт);

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


В контексте можно что-то передать, а получить новый документ - можно ф-ей - СоздатьОбъект, как писали в пред. Заполнить его в обработке, записать и уже потом открывать. Можно, чтоб не сохранялись доки если не надо открыть транзакцию, а уже после думать - сохранять или нет. Если передавать контекстом документ основание, то уже в модуле СписаниеТМЦ надо это событи обрабатывать ВводНа Основании или ПриОткрытии, не помню
Vladimir1C
Цитата(Vofka @ 01.07.11, 8:00) необходимо зарегистрироваться для просмотра ссылки
сначала я бы заполнил, а потом открыл форму

Как это сделать? Я просто не знаю.
    Док = СоздатьОбъект("Документ.СписаниеТМЦ");
    Док.Новый();
    Док.ОткрытьФорму(); /// ругань Поле агрегатного объекта не обнаружено (ОткрытьФорму) этот способ не катит, подглядел у Вас на форуме


а мне требуеться совсем казалось мало smile.gif
    Док = СоздатьОбъект("Документ.СписаниеТМЦ");
    Док.Новый();
    Док.НомерДок = 11254;
        // заполнить табличную часть, т.е. некий шаблон товаров который оператор будет редактировать
        ....
        // а тут открыть форму документа Док уже заполненого. Но как? в асистент смотрел, в обьекте Документ нету такого метода открить форму, или что в этом роде


Можно это сделать без записи документа? как типа например операция из контекстного меню мЫшкой Копировать по документу,
создаеться копия документа с новым кодом, со списком материалов, только редактируй что Вам надо и сохраняй.
vadim007
Цитата(Vladimir1C @ 01.07.11, 7:53) необходимо зарегистрироваться для просмотра ссылки
а как можно её заполнить списком материала??
Т.е. необходимо получить ссылку на документ что бы до открытия формы заполнить его или
после. Кроме контекста формы у меня ничего нет...


В обработке:
Док = СоздатьОбъект("Документ.СписаниеТМЦ");
Таб = СоздатьОбъект("ТаблицаЗначений");
создать необходимые столбцы таблицы
загрузить в Таб данные из файла
Док.ЗагрузитьТабличнуюЧасть(Таб);
Док.Записать();
Док.Провести(); // по желанию
ОткрытьФорму(Док);
kalyamov
Цитата(vadim007 @ 01.07.11, 9:42) необходимо зарегистрироваться для просмотра ссылки
В обработке:
Док = СоздатьОбъект("Документ.СписаниеТМЦ");
Таб = СоздатьОбъект("ТаблицаЗначений");
создать необходимые столбцы таблицы
загрузить в Таб данные из файла
Док.ЗагрузитьТабличнуюЧасть(Таб);
Док.Записать();
Док.Провести(); // по желанию
ОткрытьФорму(Док);


А смысл в таблице значений, если ее никто не редактирует ?


ОткрытьТранзакцию()
Док = СоздатьОбъект("Документ.СписаниеТМЦ");
загрузить в Док данные из файла
Док.Записать();
Конт="";
ОткрытьФормуМодально(Док,Конт);
Если ПустоеЗначение(конт)=0 тогда
ЗафиксироватьТранзакцию() // наш документ сохраниться
Иначе
ОтменитьТранзакцию() // Если в конт ничего не вернулось, то не сохраняем
КонецЕсли;


Может сработает, надо попробовать, не совсем уверен что именно вернет в конт, надо смотреть. Если неважно-сохранять его или нет, то без этих транзакций все должно работать нормально.
-=VJ=-
Цитата(kalyamov @ 01.07.11, 11:15) необходимо зарегистрироваться для просмотра ссылки
А смысл в таблице значений, если ее никто не редактирует ?


Это был шаблон создания нового документа, а не готовый алгоритм.
Предполагалось, что дальше автор должен сам головой подумать.
kalyamov
Цитата(-=VJ=- @ 01.07.11, 11:29) необходимо зарегистрироваться для просмотра ссылки
загрузить в Таб данные из файла
Док.ЗагрузитьТабличнуюЧасть(Таб);
Док.Записать();



Где то тут между строк надо было написать автору, что необходимо подумать головой и сделать главное.
Vladimir1C
Большое спасибо Вам всем за ответы, за внимание к моей проблемы...Это очень радует.
-=VJ=- это не шаблон нового документа...

А остальные способы...у них есть один минус - для того чтобы отобразить форму документа (заполненного перед этим содержимым из файла),
это документ требуется записать.А этого мне совсем не надо - боюсь нарушить файловую структуру 1С базы.
Да и за чем, оператор сам решит сохранят или нет.

Без этого никак??
kalyamov
Цитата(Vladimir1C @ 01.07.11, 15:37) необходимо зарегистрироваться для просмотра ссылки
А остальные способы...у них есть один минус - для того чтобы отобразить форму документа (заполненного перед этим содержимым из файла),
это документ требуется записать.А этого мне совсем не надо - боюсь нарушить файловую структуру 1С базы.
Да и за чем, оператор сам решит сохранят или нет.

Без этого никак??


Я писал про транзакции - если ее отменить, то есть пользователь нажал отменить в документе , то Док.Записать() отменяется.
Vladimir1C
Цитата(kalyamov @ 01.07.11, 15:57) необходимо зарегистрироваться для просмотра ссылки
Я писал про транзакции - если ее отменить, то есть пользователь нажал отменить в документе , то Док.Записать() отменяется.

Кажись понял ВАШУ идею....попробую.....
vadim007
Применять транзакции для управления сохранением документа - ошибка. Не для того транзакции введены в 1С. Лучше использовать первоначальный способ, описанный в первом сообщении автора:
результат = ОткрытьФорму("Документ.СписаниеТМЦ",Конт);

Далее код примерно следующий:
Если Конт = 100 Тогда
//заполнить табличную часть как я писал ранее
КонецЕсли;
Вот кажись и все решение.

Дополнение: заполнять через переменную Конт. Например:
Конт.ЗагрузитьТабличнуюЧасть(Таб);
kalyamov
Цитата(vadim007 @ 01.07.11, 20:33) необходимо зарегистрироваться для просмотра ссылки
Применять транзакции для управления сохранением документа - ошибка. Не для того транзакции введены в 1С.


А для чего их ввели ? Разве не для того, что если в момент от начала транзакции и до ее конца произошло определенное условие или ошибка, отменить предидущие сохранения и проведения ?
kalyamov
Цитата(vadim007 @ 01.07.11, 20:33) необходимо зарегистрироваться для просмотра ссылки
Применять транзакции для управления сохранением документа - ошибка. Не для того транзакции введены в 1С. Лучше использовать первоначальный способ, описанный в первом сообщении автора:
результат = ОткрытьФорму("Документ.СписаниеТМЦ",Конт);

Далее код примерно следующий:
Если Конт = 100 Тогда
//заполнить табличную часть как я писал ранее
КонецЕсли;
Вот кажись и все решение.

Дополнение: заполнять через переменную Конт. Например:
Конт.ЗагрузитьТабличнуюЧасть(Таб);


Пока документ не будет закрыт ничего нового в переменную конт передать не удастся. Можно сразу передавать данные и в модуле документа обрабатывать их через форму.параметр. Если конт = 100 - к этому условию мы прийдем если вторично запустим обработку при открытой форме нового документа или после того, как отработает метод ОткрытьФорму(), что нам уже без надобности.
5_kopeek
Цитата(kalyamov @ 01.07.11, 22:13) необходимо зарегистрироваться для просмотра ссылки
Пока документ не будет закрыт ничего нового в переменную конт передать не удастся. Можно сразу передавать данные и в модуле документа обрабатывать их через форму.параметр. Если конт = 100 - к этому условию мы прийдем если вторично запустим обработку при открытой форме нового документа или после того, как отработает метод ОткрытьФорму(), что нам уже без надобности.

Думаю, Вы правы. Этот момент можно обойти следующим образом. В обработке заполнить таблицу значений нужными данными и открыть форму нового документа, передавая в качестве параметра ту же таблицу значений:
    ОткрытьФорму("Документ.СписаниеТМЦ",Табл);

, а в процедуре ВводНового() документа СписаниеТМЦ добавить несколько строк типа:
    Если ТипЗначенияСтр(Форма.Параметр)="ТаблицаЗначений" Тогда
        ЗагрузитьТабличнуюЧасть(Форма.Параметр);
    КонецЕсли; // ТипЗначенияСтр(Форма.Параметр)="ТаблицаЗначений"

А дальше интерактивно редактировать, сохранять/не сохранять открытый заполненный документ.
vadim007
Цитата(kalyamov @ 01.07.11, 21:49) необходимо зарегистрироваться для просмотра ссылки
А для чего их ввели ? Разве не для того, что если в момент от начала транзакции и до ее конца произошло определенное условие или ошибка, отменить предидущие сохранения и проведения ?

Из файла помощи:
Понятие транзакций соответствует общепринятому пониманию транзакций баз данных. В системе 1С:Предприятие транзакции активно используются самой системой при записи различной информации. Транзакция гарантирует неизменность информации в базе данных для других пользователей до ее завершения и целостное сохранение информации.
Возможность использования транзакций в языке должна применяться только в тех программных модулях, которые выполняют запись изменений в информационной базе (в справочниках, константах, документах). Их не следует использовать в алгоритмах формирования движений документов. Транзакции также не стоит использовать при одиночных записях. Типичный пример когда следует использовать транзакции — это процедура, которая будет во всех элементах справочника менять некоторый параметр.
Действия, заключенные в транзакцию, выполняются быстрее. Особенно существенно разница проявляется в многопользовательском режиме и особенно существенна разница для операций, связанных с изменением содержимого базы данных, хотя и для операций только чтения разница может быть в разы.
Транзакция, выполняемая одним пользователем может мешать выполнению транзакций другими пользователями. Таким образом, важно соизмерять получающееся ускорение от применения транзакций с возможными побочными эффектами. Другими словами, возможно, что ускорение таково, что операция начинает выполняться столь быстро, что можно пренебречь влиянием на других пользователей (например, ожидание секунду – другую), а может это будет приводить к конфликтам — все зависит от конкретного алгоритма конфигурации.
При обработке транзакции (в том числе в Модуле документа) не следует использовать элементы интерактивного управления (например, операторы Предупреждение, Вопрос, ВвестиЧисло и т. п.), т. к. в этом случае при открытой транзакции система ожидает отклика пользователя, а это может препятствовать нормальной работе других пользователей (в результате документы у всех остальных пользователей в этот момент могут не проводиться). Если в конфигурации необходимо при проведении документа выдавать пользователю некоторые сообщения, то следует использовать операторы Сообщить или Состояние.

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

Цитата(kalyamov @ 01.07.11, 23:13) необходимо зарегистрироваться для просмотра ссылки
Пока документ не будет закрыт ничего нового в переменную конт передать не удастся. Можно сразу передавать данные и в модуле документа обрабатывать их через форму.параметр. Если конт = 100 - к этому условию мы прийдем если вторично запустим обработку при открытой форме нового документа или после того, как отработает метод ОткрытьФорму(), что нам уже без надобности.

Снова читаем документацию:
Открытие формы нового документа
ОткрытьФорму(<ОписательОбъекта>, <КонтекстФормы>, <ДокументОснование>)
<ОписательОбъекта> Строковое выражение."Документ.ХХХХХ", где ХХХХХ — идентификатор вида документа;
<ДокументОснование> Необязательный параметр. Выражение типа «документ», задающий документ-основание для открытия формы ввода нового документа в режиме ввода на основании.
Чуть выше, при описании общей формы вызова:
ОткрытьФорму
Выполняет открытие формы из'встроенного языка.
Синтаксис:
ОткрытьФорму (<Параметр1>, <КонтекстФормы>, < Параметр 3>...)
Англоязычный синоним:
OpenForm
Параметры:
<Параметр1> В зависимости от типа открываемой формы используется различные значения данного параметра.Для журналов, отчетов, списков в конце строки описателя формы может быть указан символ "#" с некоторым идентификатором: "#LLLL". Это используется для того, чтобы данная форма открылась в новом окне, а не активизировала существующее окно этой формы, если оно открыто. Где, LLLL — идентификатор, который позволяет открыть новое окно или активизировать уже открытое с этим идентификатором. Если идентификатор не задан, то обязательно открывается новое окно.
<КонтекстФормы> Необязательный параметр. Имя переменной, куда можно задать значение любого типа для передачи в открываемую форму. Данное значение будет доступно в открытой форме как атрибут Форма.Параметр.После исполнения данного метода система вернет в данную переменную контекст открытой формы (см. Передача контекста в качестве параметра). С помощью значения этого контекста можно затем произвольно манипулировать открытой формой, пока она открыта. Пока форма открыта, тип значения данного параметра равен 100 (см. ТипЗначения), если закрыта — 0.
<Параметр3>... В зависимости от типа открываемой формы используется различный состав и значения остальных параметров.

Из описания следует, что при создании новой формы, Конекст будет равен 100, пока форма не будет закрыта, и через Контекст можно происвольно манипулировать открытой формой. Т.е. можно заполнять шапку и табличную часть формы.

Цитата(5_kopeek @ 02.07.11, 0:15) необходимо зарегистрироваться для просмотра ссылки
Думаю, Вы правы. Этот момент можно обойти следующим образом. В обработке заполнить таблицу значений нужными данными и открыть форму нового документа, передавая в качестве параметра ту же таблицу значений:
ОткрытьФорму("Документ.СписаниеТМЦ",Табл);, а в процедуре ВводНового() документа СписаниеТМЦ добавить несколько строк типа:
Если ТипЗначенияСтр(Форма.Параметр)="ТаблицаЗначений" Тогда
ЗагрузитьТабличнуюЧасть(Форма.Параметр);
КонецЕсли; // ТипЗначенияСтр(Форма.Параметр)="ТаблицаЗначений"
А дальше интерактивно редактировать, сохранять/не сохранять открытый заполненный документ.

В принципе можно и так, но этот подход потребует изменения кода стандартного документа, что нежелательно.
5_kopeek
Цитата(vadim007 @ 02.07.11, 12:27) необходимо зарегистрироваться для просмотра ссылки
<КонтекстФормы> После исполнения данного метода система вернет в данную переменную контекст открытой формы (см. Передача контекста в качестве параметра). С помощью значения этого контекста можно затем произвольно манипулировать открытой формой, пока она открыта.
...
Из описания следует, что при создании новой формы, Конекст будет равен 100, пока форма не будет закрыта, и через Контекст можно происвольно манипулировать открытой формой. Т.е. можно заполнять шапку и табличную часть формы.

Не думаю, что получится произвольно манипулировать табличной частью документа, в частности, воспользоваться методом ЗагрузитьТабличнуюЧасть(), поскольку КонтекстОткрытойФормы не есть КонтекстДокумента и не есть КонтекстМодуляФормыДокумента, а "манипулировать открытой формой" не значит "манипулировать табличной частью документа". Открытую форму через ее контекст можно, например, закрыть, что и будет называться "манипулировать формой". Практически уверена, что некоторые методы через передаваемый контекст будут работать, например, при заполнении реквизитов шапки, которые можно представить как элементы диалога. В отличие от табличных реквизитов, поскольку их нельзя представить как самостоятельные элементы диалога, которые являются атрибутами формы, а лишь как составляющие таблицы документа.
Цитата
В принципе можно и так, но этот подход потребует изменения кода стандартного документа, что нежелательно.

Да, это минус. Но сработает, а это -- плюс.
kalyamov
Цитата(vadim007 @ 02.07.11, 13:27) необходимо зарегистрироваться для просмотра ссылки
Из файла помощи:
Понятие транзакций соответствует общепринятому пониманию транзакций баз данных. В системе 1С:Предприятие транзакции активно используются самой системой при записи различной информации. Транзакция гарантирует неизменность информации в базе данных для других пользователей до ее завершения и целостное сохранение информации.
Возможность использования транзакций в языке должна применяться только в тех программных модулях, которые выполняют запись изменений в информационной базе (в справочниках, константах, документах). Их не следует использовать в алгоритмах формирования движений документов. Транзакции также не стоит использовать при одиночных записях. Типичный пример когда следует использовать транзакции — это процедура, которая будет во всех элементах справочника менять некоторый параметр.
Действия, заключенные в транзакцию, выполняются быстрее. Особенно существенно разница проявляется в многопользовательском режиме и особенно существенна разница для операций, связанных с изменением содержимого базы данных, хотя и для операций только чтения разница может быть в разы.
Транзакция, выполняемая одним пользователем может мешать выполнению транзакций другими пользователями. Таким образом, важно соизмерять получающееся ускорение от применения транзакций с возможными побочными эффектами. Другими словами, возможно, что ускорение таково, что операция начинает выполняться столь быстро, что можно пренебречь влиянием на других пользователей (например, ожидание секунду – другую), а может это будет приводить к конфликтам — все зависит от конкретного алгоритма конфигурации.
При обработке транзакции (в том числе в Модуле документа) не следует использовать элементы интерактивного управления (например, операторы Предупреждение, Вопрос, ВвестиЧисло и т. п.), т. к. в этом случае при открытой транзакции система ожидает отклика пользователя, а это может препятствовать нормальной работе других пользователей (в результате документы у всех остальных пользователей в этот момент могут не проводиться). Если в конфигурации необходимо при проведении документа выдавать пользователю некоторые сообщения, то следует использовать операторы Сообщить или Состояние.

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


Снова читаем документацию:
Открытие формы нового документа
ОткрытьФорму(<ОписательОбъекта>, <КонтекстФормы>, <ДокументОснование>)
<ОписательОбъекта> Строковое выражение."Документ.ХХХХХ", где ХХХХХ — идентификатор вида документа;
<ДокументОснование> Необязательный параметр. Выражение типа «документ», задающий документ-основание для открытия формы ввода нового документа в режиме ввода на основании.
Чуть выше, при описании общей формы вызова:
ОткрытьФорму
Выполняет открытие формы из'встроенного языка.
Синтаксис:
ОткрытьФорму (<Параметр1>, <КонтекстФормы>, < Параметр 3>...)
Англоязычный синоним:
OpenForm
Параметры:
<Параметр1> В зависимости от типа открываемой формы используется различные значения данного параметра.Для журналов, отчетов, списков в конце строки описателя формы может быть указан символ "#" с некоторым идентификатором: "#LLLL". Это используется для того, чтобы данная форма открылась в новом окне, а не активизировала существующее окно этой формы, если оно открыто. Где, LLLL — идентификатор, который позволяет открыть новое окно или активизировать уже открытое с этим идентификатором. Если идентификатор не задан, то обязательно открывается новое окно.
<КонтекстФормы> Необязательный параметр. Имя переменной, куда можно задать значение любого типа для передачи в открываемую форму. Данное значение будет доступно в открытой форме как атрибут Форма.Параметр.После исполнения данного метода система вернет в данную переменную контекст открытой формы (см. Передача контекста в качестве параметра). С помощью значения этого контекста можно затем произвольно манипулировать открытой формой, пока она открыта. Пока форма открыта, тип значения данного параметра равен 100 (см. ТипЗначения), если закрыта — 0.
<Параметр3>... В зависимости от типа открываемой формы используется различный состав и значения остальных параметров.

Из описания следует, что при создании новой формы, Конекст будет равен 100, пока форма не будет закрыта, и через Контекст можно происвольно манипулировать открытой формой. Т.е. можно заполнять шапку и табличную часть формы.


В принципе можно и так, но этот подход потребует изменения кода стандартного документа, что нежелательно.


то что Вы читаете описание так глубоко похвально. Но в данном случае, кроме транзакции другого варианта пока я не вижу. Через Контекст и глобальный модуль можно пробовать, но контекст штука капризная и не думаю, что нормально сработает и не потеряется по пути. Через открытьФорму() без изменения модуля документа вряд ли что-то получится, хоть в описание все так красиво изложено - имеется ввиду уже записанный документ, а не заново веденный. То что транзакция будет мешать другим пользователям проводить документы - не факт, она может мешать, как сказано в том же описании. Если следовать точно по нему, то зачем тогда жить ?
5_kopeek
kalyamov, зачем цитировать весь пост со всеми цитатами из документации? Достаточно процитировать ключевой момент, в противном случае снижается читабельность форума.
kalyamov
Цитата(5_kopeek @ 02.07.11, 16:20) необходимо зарегистрироваться для просмотра ссылки
kalyamov, зачем цитировать весь пост со всеми цитатами из документации?


А зачем туда вставлять столько документации ? Учту на будущее, просто лень было удалять не нужное.
vadim007
В общем, поэкспериментировал с различными вариантами, покопался в инете, и выводы следующие:
1 Вариант
Док = СоздатьОбъект("Документ.СписаниеТМЦ");
Док.Новый();
Док.ЗагрузитьТабличнуюЧасть(Таб);
Рез = ОткрытьФорму(Док, Конт);

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

также не работает - ОткрытьФормуМодально(..) возвращает 0. Оно и понятно - документа в системе еще нет.
3 Вариант
ОткрытьФорму("Документ.СписаниеТМЦ", Конт);
Если ТипЗначения(Конт) = 100 Тогда
...Конт.ПричинаСписания = "Проверка алгоритма";
...Конт.ЗагрузитьТабличнуюЧасть(Таб);
...Таб.ВыбратьСтроки();
...Пока Таб.ПолучитьСтроку() = 1 Цикл
......Конт.АктивизироватьСтроку(1);
......Конт.НоваяСтрока();
......Конт.ТМЦ = Таб.ТМЦ;
......Конт.Партия = Таб.Партия;
......Конт.Кво = Таб.Кво;
......Конт.Ед = Таб.Ед;
......Конт.Коэффициент = Таб.Коэффициент;
......Конт.ЦенаБезНДС = Таб.ЦенаБезНДС;
......Конт.СуммаБезНДС = Таб.СуммаБезНДС;
......Конт.СуммаСНДС = Таб.СуммаСНДС;
......Конт.НДС = Таб.НДС;
...КонецЦикла;
КонецЕсли;

документ открывается, но ТЧ пуста. Это багофича от 1С.
Т.о., работоспособный вариант - внести некоторые изменения в код формы документа. Или анализировать параметр, как предложила 5 копеек, или дописать ВводНаОсновании(..). Более просто - анализировать переданный форме параметр.
PS: в инете натыкался на обсуждение этой проблемы аж в 90-х годах.
kalyamov
Цитата(vadim007 @ 02.07.11, 21:13) необходимо зарегистрироваться для просмотра ссылки
документ открывается, но ТЧ пуста. Это багофича от 1С.


Это не фича, после открытьформу() с конт работать как Вы написали нет смысла.

"Можно сразу передавать данные и в модуле документа обрабатывать их через форму.параметр." А это я Вам написал на первый призыв не трогать транзакцию. Хотя, проверю еще сам, как оно неработает.
5_kopeek
Цитата(vadim007 @ 02.07.11, 20:13) необходимо зарегистрироваться для просмотра ссылки
В общем, поэкспериментировал с различными вариантами, покопался в инете, и выводы следующие:
3 Вариант
ОткрытьФорму("Документ.СписаниеТМЦ", Конт);
Если ТипЗначения(Конт) = 100 Тогда
...
...Конт.ЗагрузитьТабличнуюЧасть(Таб);
...Таб.ВыбратьСтроки();
...Пока Таб.ПолучитьСтроку() = 1 Цикл
......Конт.АктивизироватьСтроку(1);
......Конт.НоваяСтрока();
...
КонецЕсли;

Зачем Вы пытаетесь активизировать строку, которой нет?
Цитата(vadim007 @ 02.07.11, 20:13) необходимо зарегистрироваться для просмотра ссылки
документ открывается, но ТЧ пуста. Это багофича от 1С.

Об этом и шла речь. Это не багофича, а
Цитата(5_kopeek @ 02.07.11, 14:39) необходимо зарегистрироваться для просмотра ссылки
Не думаю, что получится произвольно манипулировать табличной частью документа, в частности, воспользоваться методом ЗагрузитьТабличнуюЧасть(), поскольку КонтекстОткрытойФормы не есть КонтекстДокумента и не есть КонтекстМодуляФормыДокумента, а "манипулировать открытой формой" не значит "манипулировать табличной частью документа".
vadim007
Цитата(5_kopeek @ 02.07.11, 23:06) необходимо зарегистрироваться для просмотра ссылки
Зачем Вы пытаетесь активизировать строку, которой нет?

Это остатки кода от шаманства.
-=VJ=-
Цитата(5_kopeek @ 02.07.11, 23:06) необходимо зарегистрироваться для просмотра ссылки
Об этом и шла речь.


Некоторые любят наступать на грабли самостоятельно smile.gif
kalyamov
Надо как то уже подитоживать тему. Она не первый раз поднимается на форумах, но конкретного решения никто не озвучил - помоему, просто жмутся, чтоб другим не досталось.
1. Добавлять в модуле документа обработку - форма.параметр
2. Через транзакцию - пусть он и не правильный, но можно работать, если это редкие случаи.
3. Искать другой вариант, он есть, но о нем не хотят писать. Как то через контекст пробовать. Открыть форму, на какое то время сделать так , чтоб пользователь не мог с ней работать,заполнить ее и открыть форму еще раз, тогда у нас будет контекст открытой формы, но еще не записаной. Это теория, надо проверить.
vadim007
Цитата(kalyamov @ 03.07.11, 13:30) необходимо зарегистрироваться для просмотра ссылки
3. Искать другой вариант, он есть, но о нем не хотят писать.

В инете было решение через использование внешних компонент (Formex и др), но это нарушает лицензионные условия 1С.
kalyamov
Цитата(vadim007 @ 03.07.11, 13:44) необходимо зарегистрироваться для просмотра ссылки
В инете было решение через использование внешних компонент (Formex и др), но это нарушает лицензионные условия 1С.


Там некоторые хвастались, что есть у них еще какое то решение, но на предложение поделиться - отшучивались. Черт его знает, верить или нет. Самый приемлимый вариант - изменение модуля документа. Только при обновлении релиза будут проблемы, но тут уж надо выбирать.
5_kopeek
Цитата(kalyamov @ 03.07.11, 12:52) необходимо зарегистрироваться для просмотра ссылки
Самый приемлимый вариант - изменение модуля документа. Только при обновлении релиза будут проблемы, но тут уж надо выбирать.

Человек пишет обработку для загрузки данных из какого-то файла, неужели для него будет проблемой восстановить 3 строчки в документе после обновления?! Тем более, СписаниеТМЦ -- не самый изменяемый документ, не удивлюсь, если в 10 последних релизах он менялся аж раз.
kalyamov
Цитата(5_kopeek @ 03.07.11, 16:03) необходимо зарегистрироваться для просмотра ссылки
Человек пишет обработку для загрузки данных из какого-то файла, неужели для него будет проблемой восстановить 3 строчки в документе после обновления?! Тем более, СписаниеТМЦ -- не самый изменяемый документ, не удивлюсь, если в 10 последних релизах он менялся аж раз.


Это к чему?
Vofka
Цитата(kalyamov)
Это к чему?

Я так понял, к тому, что
Цитата(vadim007)
Т.о., работоспособный вариант - внести некоторые изменения в код формы документа. Или анализировать параметр, как предложила 5 копеек, или дописать ВводНаОсновании(..). Более просто - анализировать переданный форме параметр.
kalyamov
Цитата(Vofka @ 03.07.11, 17:11) необходимо зарегистрироваться для просмотра ссылки
Я так понял, к тому, что


"Можно сразу передавать данные и в модуле документа обрабатывать их через форму.параметр" - предложено давно и не 5 коп.. Уже предложено тему подитожить и закрыть. К чему дальнейший треп ?
5_kopeek
Цитата(kalyamov @ 03.07.11, 15:54) необходимо зарегистрироваться для просмотра ссылки
Это к чему?

Вы выразили опасения
Цитата(kalyamov @ 03.07.11, 12:52) необходимо зарегистрироваться для просмотра ссылки
Только при обновлении релиза будут проблемы, но тут уж надо выбирать.

, что при изменении модуля документа возникнут сложности с обновлением. Поскольку Вам непонятен был смысл моего поста, попробую объяснить более доступно. Мои слова были к тому, что человеку, который может написать обработку по загрузке данных из файла, не составит труда при установке очередного обновления вписать 3 строчки необходимого кода в модуль документа. К тому же речь идет о документе, который очень редко меняется в типовой конфигурации, поэтому вполне вероятно, что и вписывать ничего не придется -- просто снимать галку с этого документа при обновлении. Так что не думаю, что возникнут большие проблемы и стоит сложный выбор.
Цитата(kalyamov @ 03.07.11, 16:22) необходимо зарегистрироваться для просмотра ссылки
"Можно сразу передавать данные и в модуле документа обрабатывать их через форму.параметр" - предложено давно и не 5 коп..

Калям., хоть и процитировала Вас
Цитата(kalyamov @ 01.07.11, 22:13) необходимо зарегистрироваться для просмотра ссылки
... Можно сразу передавать данные и в модуле документа обрабатывать их через форму.параметр...

, а только сейчас заметила (пришлось специально перечитать всю тему smile.gif), что это -- передать данные, а не получать контекст, через параметр -- впервые было предложено Вами. В общем, не претендую на первенство, не переживайте так сильно.
kalyamov
Я не переживаю, хоть по некоторым предидущим темам заметил странную тенденцию. По поводу моего опасения насчет обновления - не думаю, что это лишнее предупреждение автору темы. Вам конечно, оно не к чему, три строчки , три там.

Цитата(5_kopeek @ 03.07.11, 23:11) необходимо зарегистрироваться для просмотра ссылки
Поскольку Вам непонятен был смысл моего поста, попробую объяснить более доступно.


Лучше попробуйте понять, к чему я написал к чему это ?
Vladimir1C
Добрый день!
Провозился немного на выходных, пробуя Ваши советы, но увы пока невезет...
при вызове из обработки на кнопку
 
    НачатьТранзакцию();
    Док = СоздатьОбъект("Документ.СписаниеТМЦ");    
    Док.Записать();       /// здесь вызываеться  err при попытке записи и код дальше не выполняется...
    Конт="";
    ОткрытьФормуМодально(Док,Конт);
    Если ПустоеЗначение(конт)=0 тогда
    ЗафиксироватьТранзакцию();
    Сообщить("документ сохраниться");    
    Иначе
    ОтменитьТранзакцию(); // Если в конт ничего не вернулось, то не сохраняем
    Сообщить("в конт ничего не вернулось");    
    КонецЕсли;


Не работает. при выполнении кода Док.Записать(); пишет: err: Док.Записать();
и все.
Моя мечта создать обработку которая загружает список товара из файла(*.DBF) полученого из терминала сбора данных(это без особых проблем реализовано)
и на кнопку этот список загружать в новый документ который отображаться пользователю, тот его правит потом
сохрнаняет...
Не дается последняя часть вроде все елементарно, создал обьект документа залил туда информацию, показал пользователю.

Но есть сильное желание реализовать это без записи документа и без модификации основной конфигурации, посредством только обработки.
Т.е. не трогая модуль докумнта.

В журнале документов, на прав клик мышкой есть меню, команда "Копировать" 1С создает копию существ документа из нов номером из таким же перечнем материала...
Это то похожее что хотел реализовать.



Запоздалый у меня этот ответ, извините...(не обновил страничку форума)
5_kopeek
Цитата(Vladimir1C @ 04.07.11, 10:28) необходимо зарегистрироваться для просмотра ссылки
Запоздалый у меня этот ответ, извините...(не обновил страничку форума)

Да уж, тут такие страсти, а Вы о каком-то заполнении без изменения конфигурации... biggrin.gif
Vladimir1C
Цитата(5_kopeek @ 04.07.11, 11:31) необходимо зарегистрироваться для просмотра ссылки
Да уж, тут такие страсти, а Вы о каком-то заполнении без изменения конфигурации... biggrin.gif


Да это точно...
Есть шанс попробовать использовать передачу параметров в документ - это сработает.
Придется подпортить ориг код модуля, ну и ладно.
Vofka
Цитата
Есть шанс попробовать использовать передачу параметров в документ - это сработает.

Ну вы ж потом результат предоставьте, вдруг ещё кому пригодится wink.gif
Vladimir1C
Хорошо)
Vladimir1C
Доброе утро, участникам форума!
Предоставляю результат, может кому пригодится(да и хоть как то отблагодарить Вам всем за выявленную поддержку).
Если вкратце, воспользовался советом 5_kopeek.

Как это выглядит:
во внешней обработке код такой:
Процедура СоздатьСписаниеТМЦ()
                
    ОткрытьФорму("Документ.СписаниеТМЦ",ТаблицаЗнач);
            
КонецПроцедуры


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

//вот  еще один вариант заполнения, но я его не совсем понял.таблица значений
///наверное должна быть идентична табличной части документа???  просто еще не пробивал вариант...
///        ЗагрузитьТабличнуюЧасть(Форма.Параметр);

    Сообщить("Пошли мои параметры...");
        
    КонецЕсли; // ТипЗначенияСтр(Форма.Параметр)="ТаблицаЗначений"    
        
КонецПроцедуры


Вот и все. На кнопку во внешней обработке создается форма нового документа(ранее не записанного в базу,напомню)
с уже заполненными позициями переданными из обработки, которая их загрузила из файла.

Надо попробовать еще этот вариант: help.gif
Процедура ВводНового(ПризнакКопирования)
    
        // ....код выше не изменял, там выполняются установка, первоначальная инициализация и прочея
    /// это код размещен в самом конце(надеюсь на на что больше не влияет, кроме на то что надо сделать), который обрабатывает принимаемый параметр
    Если ТипЗначенияСтр(Форма.Параметр)="ТаблицаЗначений" Тогда        

               ЗагрузитьТабличнуюЧасть(Форма.Параметр);
           Сообщить("Пошли мои параметры...");        

    КонецЕсли; // ТипЗначенияСтр(Форма.Параметр)="ТаблицаЗначений"    
        
КонецПроцедуры


Но я не понял в каком виде надо создавать таблицу значений в параметре Форма.Параметр.

Напоследок скажу, один товарищ говорил мне передавать параметры также(если я его правильно понял, в детали правда не посвятил,т.е. на словах объяснил ),
но в теле "Процедура ВводНаОснованииВводНаОсновании(Док)" он посмотрел конфигурацию базы и предлагал сделать там проверку на тип и если это
тип таблица то соответственно делать свое.
Аргументировал он это что ввод на основании документа "Списание ТМЦ" предусмотрен только на основании документа "Инвентаризация".
Если честно я его не совсем(или вообще не ) понял..Попытался распросить, но увы пока молчит.
Не знаю как правильней, но то получилось уже работает, та что...над этим голова уже не болит :-)
5_kopeek
Цитата(Vladimir1C @ 07.07.11, 9:16) необходимо зарегистрироваться для просмотра ссылки
Надо попробовать еще этот вариант: help.gif
Процедура ВводНового(ПризнакКопирования)
    Если ТипЗначенияСтр(Форма.Параметр)="ТаблицаЗначений" Тогда        
               ЗагрузитьТабличнуюЧасть(Форма.Параметр);
    КонецЕсли; // ТипЗначенияСтр(Форма.Параметр)="ТаблицаЗначений"    
КонецПроцедуры

Но я не понял в каком виде надо создавать таблицу значений в параметре Форма.Параметр.

Если в обработке создать таблицу значений, содержащую нужные для заполнения в СписанииТМЦ колонки (с идентичными идентификаторами), и заполнить ее соответствующими данными из файла, то эту таблицу значений, передав в документ в качестве параметра, можно непосредственно загрузить в таблицу документа методом ЗагрузитьТабличнуюЧасть(). Данные, загружаясь из ТЗ в таблчасть, будут совмещаться по идентификаторам колонок. Т.е. если таблица значений содержит колонку ТМЦ, значениями которой будут товары, а не их коды, то при использовании ЗагрузитьТабличнуюЧасть(Форма.Параметр) все товары попадут в табличную часть документа.
Цитата(Vladimir1C @ 07.07.11, 9:16) необходимо зарегистрироваться для просмотра ссылки
Аргументировал он это что ввод на основании документа "Списание ТМЦ" предусмотрен только на основании документа "Инвентаризация".
Если честно я его не совсем(или вообще не ) понял..Попытался распросить, но увы пока молчит.

Не знаю, каким боком приклеить ввод на основании инвентаризации к загрузке данных из файла. И зачем это делать вообще.
Vladimir1C
Цитата(5_kopeek @ 07.07.11, 10:54) необходимо зарегистрироваться для просмотра ссылки
Если в обработке создать таблицу значений, содержащую нужные для заполнения в СписанииТМЦ колонки (с идентичными идентификаторами), и заполнить ее соответствующими данными из файла, то эту таблицу значений, передав в документ в качестве параметра, можно непосредственно загрузить в таблицу документа методом ЗагрузитьТабличнуюЧасть(). Данные, загружаясь из ТЗ в таблчасть, будут совмещаться по идентификаторам колонок. Т.е. если таблица значений содержит колонку ТМЦ, значениями которой будут товары, а не их коды, то при использовании ЗагрузитьТабличнуюЧасть(Форма.Параметр) все товары попадут в табличную часть документа.


:-) Ага... Т.е. если даже моя таблица значение, содержит поле из ТМЦ, то товары попадут в табличную часть документа.
Попробую создать такую таблицу при чтении файла и использовать "ЗагрузитьТабличнуюЧасть(Форма.Параметр)" так на порядок надежней.

Цитата(5_kopeek @ 07.07.11, 10:54) необходимо зарегистрироваться для просмотра ссылки
Не знаю, каким боком приклеить ввод на основании инвентаризации к загрузке данных из файла. И зачем это делать вообще.


Тоже без понятия.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.