Помощь - Поиск - Пользователи - Календарь
Полная версия: Учебный вопрос.
1C-PRO - Форум по 1С > Форумы по платформе "1С:Предприятие 8.x" > (8.х) Конфигурирование на платформе "1С:Предприятие 8.x"
Серёга
Решил создать отдельную тему, чтоб не засорять форум. Здесь буду задавать вопросы по конфигурированию, их будет много. biggrin.gif


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


Эта же процедура определена как обработчик события "При изменении" для элемента управления "Видоперации".

Проблема в том, что реквизиты не скрываются. Как заставить их скрыться?
lazy
Если память мне не изменяет - в документах с несколькими видами как правило присутствует код управляющий видимостью элементов в зависимости от вида документа(ох загнул). Т.е. код твой скорее всего выполняется корректно, но после этого другой участок кода обратно делает элементы видимыми...
BabySG
Смотри процедуру УстановитьВидимость()
wertklop
а не проще установить видимость элементов фрмы в ложь:
ЭлементыФормы.Контрагент.Видимость=ложь;
ЭлементыФормы.Договор.Видимость=ложь;
ЭлементыФормы.НадписьДоговор.Видимость=ложь;
ЭлементыФормы.НадписьКонтрагент.Видимость=ложь;
ведь для этого оределены стандартные свойства объектов, зачем придумывать колесо, да и код поменьше становится.....
Серёга
Всем спасибо за идеи.
Сделал последний вариант- сработало, реквизиты скрылись.
Но это не совсем то. По варианту wertklop они скрываются раз и навсегда. В варианте который написал я, они скрываются после выбора Вида операции "РеализацияРозница", так как (в моем случае) при оформлении розничной продажи реквизиты "Контрагент" и "Договор" не нужны, При выборе "Реализация продажа" реквизиты остаются на месте.
BabySG
Еще раз: смотри процедуру УстановитьВидимость()
Серёга
Вопрос.
Есть регистр сведений "ЦеныПоступления", он имеет
1. Измерения -Поставщик, Номенклатура.
2. Ресурсы - Цена.

Есть документ "ПоступлениеТоваров", в табличной части присутствует поле ввода Цена.

Как реализовать механизм автоподстановки цены закупки в том случае если данный товар уже поступал от выбранного поставщика?
BabySG
Это встроенная возможность :) Покрути в справке - нужно поставить галку 2регистрировать цены поставщика", насколько я помню
Серёга
Нужно реализовать с помощью процедуры.
BabySG
На момент изменения поля номенклатуры или хар-тики делаешь процедуру, которая делает срез последних по регистру с отбором и получаешь свою цену, которая подставиться в поле.
Серёга
Цитата(BabySG @ 1.8.2008, 13:23) *

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

sample.gif Блин, в методичке по минимуму рассказано, не могу ни как въехать vis.gif
Помогите процедуру написать. До этого задания в методичке была разобрана процедура для Курса валют, думаю, ее надо преобразовать. У регистра "КурсыВалют" есть одно измерение "Валюта", а у "ЦеныПоступления" измерений два: "Поставщик" и "Номенклатура", не могу понять как описываются два измерения.
Код
Процедура ВалютаПриИзменении(Элемент)
Отбор=Новый Структура("Валюта",Валюта);
Запись=РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Дата,Отбор);
Курс=Запись.Курс;
Кратность=Запись.Кратность;
История.Отбор.Валюта.Значение=Валюта;
История.Отбор.Валюта.Использование=Истина;
КонецПроцедуры




Модуль формы документа "ПоступлениеТовара"
Код
Процедура ТоварыНоменклатураПриИзменении(Элемент)
СтрокаТЧ=ЭлементыФормы.Товары.ТекущиеДанные;
СтрокаТЧ.ЕдиницаИзмерения=СтрокаТЧ.Номенклатура.ЕдиницаХраненияОстатков;
КонецПроцедуры
Процедура ТоварыЕдиницаИзмеренияПриИзменении(Элемент)
СтрокаТЧ=ЭлементыФормы.Товары.ТекущиеДанные;
Измененная=СтрокаТЧ.ЕдиницаИзмерения.ЕдиницаПоКлассификатору;
База=СтрокаТЧ.Номенклатура.Базовая.ЕдиницаИзмерения;
Если Измененная<>База Тогда
Сообщить("У выбираемой единицы измерения не совпадает базовая!!!");
СтрокаТЧ.ЕдиницаИзмерения=СтрокаТЧ.Номенклатура.ЕдиницаХраненияОстатков;
КонецЕсли;
КонецПроцедуры
Процедура ТоварыЦенаПриИзменении(Элемент)
СтрокаТЧ=ЭлементыФормы.Товары.ТекущиеДанные;

СтрокаТЧ.Сумма=СтрокаТЧ.Цена*СтрокаТЧ.Количество;
СуммаДокумента=Товары.Итог("Сумма")+Услуги.Итог("Сумма");
КонецПроцедуры
Процедура УслугиЦенаПриИзменении(Элемент)
СтрокаТЧ=Элементыформы.Услуги.ТекущиеДанные;
СтрокаТЧ.Сумма=СтрокаТЧ.Цена*СтрокаТЧ.Количество;
СуммаДокумента=Товары.Итог("Сумма")+Услуги.Итог("Сумма");
КонецПроцедуры


Stack_G
Код
 Процедура НоменклатураПриИзменении(Элемент)
ТекСтрока = ЭлементыФормы.Товары.ТекущиеДанные;
Отбор=Новый Структура("Поставщик, Номенклатура", Контрагент, ТекСтрока.Номенклатура );
Запись=РегистрыСведений.ЦеныПоступления.СрезПоследних(ТекущаяДата(),Отбор);
ТекСтрока.Цена = Запись[0].Цена;
КонецПроцедуры


Вроде так, не проверял.
Серёга
Цитата
{Документ.ПоступлениеТоваров.Форма.ФормаДокумента(6)}: Индекс находится за границами массива
ТекСтрока.Цена = Запись[0].Цена;


А что означает [0] ?
Серёга
Я сделал так:
Код
Процедура ТоварыНоменклатураПриИзменении(Элемент)
СтрокаТЧ=ЭлементыФормы.Товары.ТекущиеДанные;
СтрокаТЧ.ЕдиницаИзмерения=СтрокаТЧ.Номенклатура.ЕдиницаХраненияОстатков;
Отбор=Новый Структура("Поставщик, Номенклатура", Контрагент, СтрокаТЧ.Номенклатура );
Запись=РегистрыСведений.ЦеныПоступления.ПолучитьПоследнее(ТекущаяДата(),Отбор);
СтрокаТЧ.Цена = Запись.Цена;
КонецПроцедуры



но ничего не дало. Ошибок нет и авто подстановки тоже нет. cowboy.gif
Чего не так?
Stack_G
Из Синтаксис-помощника:

РегистрСведенийМенеджер.<Имя регистра сведений> (InformationRegisterManager.<Имя регистра сведений>)
СрезПоследних (SliceLast)
Синтаксис:
СрезПоследних(<Конец периода>, <Отбор>)
Параметры:
<Конец периода> (необязательный)
Тип: Дата, МоментВремени, Граница. Определяет момент времени, заканчивая которым необходимо выбрать записи.
Если параметр не указан, то будут возвращены значения ресурсов самой последней записи регистра.
<Отбор> (необязательный)
Тип: Структура. Структура, содержащая отбор по измерениям и реквизитам регистра. Имя ключа структуры должно совпадать с именем измерения регистра, заданного в конфигураторе, а значение элемента структуры - задает отбираемое по данному измерению значение. Если параметр не указан, то отбор не используется.
Возвращаемое значение:
Тип: ТаблицаЗначений. Таблица значений, заполненная данными найденных записей регистра сведений.
Описание:
Получает наиболее поздние записи регистра, соответствующие установленным в параметрах метода значениям ключевых полей. Записи подбираются для каждого сочетания из всех имеющихся значений измерений регистра.
Примечание:
Применим только для периодических регистров сведений.
Пример:
МаркетингЦен = РегистрыСведений.МаркетингЦен;
ТекущиеЦеныКонкурентов = МаркетингЦен.СрезПоследних(ТекущаяДата());

Т.е. "Запись" - ТаблицаЗначений, значит записей нет, Зfпись[0]- первая строка ТЗ.

Код

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




А твоя процедура вроде правильная, просто скорее всего нет записей по твоим измерениям на текущую дату.
Stack_G
И то и другое у меня работает:

Код

ТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("00004");
Номенклатура = Справочники.Номенклатура.НайтиПоКоду("08818");
Отбор=Новый Структура("ТипЦен, Номенклатура", ТипЦен, Номенклатура );
Запись=РегистрыСведений.ЦеныНоменклатуры.ПолучитьПоследнее(ТекущаяДата(),Отбор);
Цена = Запись.Цена;

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

Dmitrij
Думаю никто не против если я задам свой учебный вопрос?
Прохожу по книжкам курс программирования 1С. Столкнулся с проблемой при отладке система выдает сообщение "приобразование к типу число не может быть выполнено" как можно исправить?
Stack_G
видимо, у тебя тип переменной непреобразуем системой к типу "Число", т.е. имеет тип NULL, неопределено, СправочникСсылка, ДокументСсылка и т.д.
Ты, например, суммируешь что-то и система говорит, что нельзя сложить число с NULL.

А = NULL;
В = 12 + А; // сдесь выдаст ошибку
Dmitrij
Цитата(Stack_G @ 7.8.2008, 12:14) *

видимо, у тебя тип переменной непреобразуем системой к типу "Число", т.е. имеет тип NULL, неопределено, СправочникСсылка, ДокументСсылка и т.д.

Это я понял, я через отладчик смотрел и вот результат: у меня 3 переменных с=а+в, с-число а-неопределенно и в-число, а как обойти этот момент чтоб все работало корректно
Melanto
Цитата(Dmitrij @ 7.8.2008, 7:26) *

Думаю никто не против если я задам свой учебный вопрос?
Прохожу по книжкам курс программирования 1С. Столкнулся с проблемой при отладке система выдает сообщение "приобразование к типу число не может быть выполнено" как можно исправить?

А еще может быть такое:
Код
		Если СрезПоследних[0].Поле6<>"" Тогда Адрес=СрезПоследних[0].Поле6; КонецЕсли;
Если (СрезПоследних[0].Поле7<>"")и(Адрес<>"") Тогда Адрес=Адрес+", дом "+СрезПоследних[0].Поле7; КонецЕсли;
Если (СрезПоследних[0].Поле8<>"")и(Адрес<>"") Тогда Адрес=Адрес+", корп. "+СрезПоследних[0].Поле8; КонецЕсли;
Возврат Адрес;


если СрезПоследних[0].Поле6="" и программа попадет во второе условие, то переменная Адрес - неопределена, ну по сути тот же NULL, и вылетит та же ошибка

Цитата(Dmitrij @ 7.8.2008, 16:48) *

Это я понял, я через отладчик смотрел и вот результат: у меня 3 переменных с=а+в, с-число а-неопределенно и в-число, а как обойти этот момент чтоб все работало корректно

Вставить проверку: Если а=неопределено тогда.... иначе...
А почему неопределено?
Stack_G
Цитата
Вставить проверку: Если а=неопределено тогда.... иначе...

Лучше
Цитата

Если ЗначениеНеЗаполнено(а) Тогда
...
Иначе
...
КонецЕсли;


Если же переменную получаешь из запроса, лучше прописать проверочку прямо в нем ;)
Серёга
Удалил. Разобрался.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2009 Invision Power Services, Inc.