8.х Учебный вопрос.

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем SergeyF, 28 июл 2008.

  1. TopicStarter Overlay
    SergeyF
    Offline

    SergeyF Опытный в 1С

    Регистрация:
    1 фев 2007
    Сообщения:
    1.378
    Симпатии:
    0
    Баллы:
    26
    Решил создать отдельную тему, чтоб не засорять форум. Здесь буду задавать вопросы по конфигурированию, их будет много. :unsure:


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

    Проблема в том, что реквизиты не скрываются. Как заставить их скрыться?
  2. lazy
    Offline

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

    Регистрация:
    1 сен 2007
    Сообщения:
    2.127
    Симпатии:
    4
    Баллы:
    29
    Если память мне не изменяет - в документах с несколькими видами как правило присутствует код управляющий видимостью элементов в зависимости от вида документа(ох загнул). Т.е. код твой скорее всего выполняется корректно, но после этого другой участок кода обратно делает элементы видимыми...
  3. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Смотри процедуру УстановитьВидимость()
  4. wertklop
    Offline

    wertklop Опытный в 1С

    Регистрация:
    12 май 2008
    Сообщения:
    321
    Симпатии:
    0
    Баллы:
    26
    а не проще установить видимость элементов фрмы в ложь:
    ЭлементыФормы.Контрагент.Видимость=ложь;
    ЭлементыФормы.Договор.Видимость=ложь;
    ЭлементыФормы.НадписьДоговор.Видимость=ложь;
    ЭлементыФормы.НадписьКонтрагент.Видимость=ложь;
    ведь для этого оределены стандартные свойства объектов, зачем придумывать колесо, да и код поменьше становится.....
  5. TopicStarter Overlay
    SergeyF
    Offline

    SergeyF Опытный в 1С

    Регистрация:
    1 фев 2007
    Сообщения:
    1.378
    Симпатии:
    0
    Баллы:
    26
    Всем спасибо за идеи.
    Сделал последний вариант- сработало, реквизиты скрылись.
    Но это не совсем то. По варианту wertklop они скрываются раз и навсегда. В варианте который написал я, они скрываются после выбора Вида операции "РеализацияРозница", так как (в моем случае) при оформлении розничной продажи реквизиты "Контрагент" и "Договор" не нужны, При выборе "Реализация продажа" реквизиты остаются на месте.
  6. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Еще раз: смотри процедуру УстановитьВидимость()
  7. TopicStarter Overlay
    SergeyF
    Offline

    SergeyF Опытный в 1С

    Регистрация:
    1 фев 2007
    Сообщения:
    1.378
    Симпатии:
    0
    Баллы:
    26
    Вопрос.
    Есть регистр сведений "ЦеныПоступления", он имеет
    1. Измерения -Поставщик, Номенклатура.
    2. Ресурсы - Цена.

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

    Как реализовать механизм автоподстановки цены закупки в том случае если данный товар уже поступал от выбранного поставщика?
  8. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Это встроенная возможность :) Покрути в справке - нужно поставить галку 2регистрировать цены поставщика", насколько я помню
  9. TopicStarter Overlay
    SergeyF
    Offline

    SergeyF Опытный в 1С

    Регистрация:
    1 фев 2007
    Сообщения:
    1.378
    Симпатии:
    0
    Баллы:
    26
    Нужно реализовать с помощью процедуры.
  10. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    На момент изменения поля номенклатуры или хар-тики делаешь процедуру, которая делает срез последних по регистру с отбором и получаешь свою цену, которая подставиться в поле.
  11. TopicStarter Overlay
    SergeyF
    Offline

    SergeyF Опытный в 1С

    Регистрация:
    1 фев 2007
    Сообщения:
    1.378
    Симпатии:
    0
    Баллы:
    26
    :unsure: Блин, в методичке по минимуму рассказано, не могу ни как въехать :smile:
    Помогите процедуру написать. До этого задания в методичке была разобрана процедура для Курса валют, думаю, ее надо преобразовать. У регистра "КурсыВалют" есть одно измерение "Валюта", а у "ЦеныПоступления" измерений два: "Поставщик" и "Номенклатура", не могу понять как описываются два измерения.
    Код:
    Процедура ВалютаПриИзменении(Элемент)
    Отбор=Новый Структура("Валюта",Валюта);
    Запись=РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Дата,Отбор);
    Курс=Запись.Курс;
    Кратность=Запись.Кратность;
    История.Отбор.Валюта.Значение=Валюта;
    История.Отбор.Валюта.Использование=Истина;
    КонецПроцедуры
    
    
    
    Модуль формы документа "ПоступлениеТовара"
    Код:
    Процедура ТоварыНоменклатураПриИзменении(Элемент)
    СтрокаТЧ=ЭлементыФормы.Товары.ТекущиеДанные;
    СтрокаТЧ.ЕдиницаИзмерения=СтрокаТЧ.Номенклатура.ЕдиницаХраненияОстатков;
    КонецПроцедуры
    Процедура ТоварыЕдиницаИзмеренияПриИзменении(Элемент)
    СтрокаТЧ=ЭлементыФормы.Товары.ТекущиеДанные;
    Измененная=СтрокаТЧ.ЕдиницаИзмерения.ЕдиницаПоКлассификатору;
    База=СтрокаТЧ.Номенклатура.Базовая.ЕдиницаИзмерения;
    Если Измененная<>База Тогда
    Сообщить("У выбираемой единицы измерения не совпадает базовая!!!");
    СтрокаТЧ.ЕдиницаИзмерения=СтрокаТЧ.Номенклатура.ЕдиницаХраненияОстатков;
    КонецЕсли;
    КонецПроцедуры
    Процедура ТоварыЦенаПриИзменении(Элемент)
    СтрокаТЧ=ЭлементыФормы.Товары.ТекущиеДанные;
    
    СтрокаТЧ.Сумма=СтрокаТЧ.Цена*СтрокаТЧ.Количество;
    СуммаДокумента=Товары.Итог("Сумма")+Услуги.Итог("Сумма");
    КонецПроцедуры
    Процедура УслугиЦенаПриИзменении(Элемент)
    СтрокаТЧ=Элементыформы.Услуги.ТекущиеДанные;
    СтрокаТЧ.Сумма=СтрокаТЧ.Цена*СтрокаТЧ.Количество;
    СуммаДокумента=Товары.Итог("Сумма")+Услуги.Итог("Сумма");
    КонецПроцедуры
    
    
    
  12. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    Код:
     Процедура НоменклатураПриИзменении(Элемент)
    ТекСтрока = ЭлементыФормы.Товары.ТекущиеДанные;
    Отбор=Новый Структура("Поставщик, Номенклатура", Контрагент, ТекСтрока.Номенклатура );
    Запись=РегистрыСведений.ЦеныПоступления.СрезПоследних(ТекущаяДата(),Отбор);
    ТекСтрока.Цена = Запись[0].Цена;
    КонецПроцедуры
    
    Вроде так, не проверял.
  13. TopicStarter Overlay
    SergeyF
    Offline

    SergeyF Опытный в 1С

    Регистрация:
    1 фев 2007
    Сообщения:
    1.378
    Симпатии:
    0
    Баллы:
    26
    А что означает [0] ?
  14. TopicStarter Overlay
    SergeyF
    Offline

    SergeyF Опытный в 1С

    Регистрация:
    1 фев 2007
    Сообщения:
    1.378
    Симпатии:
    0
    Баллы:
    26
    Я сделал так:
    Код:
    Процедура ТоварыНоменклатураПриИзменении(Элемент)
    СтрокаТЧ=ЭлементыФормы.Товары.ТекущиеДанные;
    СтрокаТЧ.ЕдиницаИзмерения=СтрокаТЧ.Номенклатура.ЕдиницаХраненияОстатков;
    Отбор=Новый Структура("Поставщик, Номенклатура", Контрагент, СтрокаТЧ.Номенклатура );
    Запись=РегистрыСведений.ЦеныПоступления.ПолучитьПоследнее(ТекущаяДата(),Отбор);
    СтрокаТЧ.Цена = Запись.Цена;      
    КонецПроцедуры
    
    
    
    но ничего не дало. Ошибок нет и авто подстановки тоже нет. :unsure:
    Чего не так?
  15. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    Из Синтаксис-помощника:

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

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

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

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    И то и другое у меня работает:

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

    Dmitrij Опытный в 1С

    Регистрация:
    6 май 2008
    Сообщения:
    844
    Симпатии:
    1
    Баллы:
    26
    Думаю никто не против если я задам свой учебный вопрос?
    Прохожу по книжкам курс программирования 1С. Столкнулся с проблемой при отладке система выдает сообщение "приобразование к типу число не может быть выполнено" как можно исправить?
  18. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    видимо, у тебя тип переменной непреобразуем системой к типу "Число", т.е. имеет тип NULL, неопределено, СправочникСсылка, ДокументСсылка и т.д.
    Ты, например, суммируешь что-то и система говорит, что нельзя сложить число с NULL.

    А = NULL;
    В = 12 + А; // сдесь выдаст ошибку
  19. Dmitrij
    Offline

    Dmitrij Опытный в 1С

    Регистрация:
    6 май 2008
    Сообщения:
    844
    Симпатии:
    1
    Баллы:
    26
    Это я понял, я через отладчик смотрел и вот результат: у меня 3 переменных с=а+в, с-число а-неопределенно и в-число, а как обойти этот момент чтоб все работало корректно
  20. Melanto
    Offline

    Melanto Опытный в 1С

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

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

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