Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
18 мая 2026, 07:46

РЕГИСТРЫ СВЕДЕНИЙ. ПОЛУЧЕНИЕ ДАННЫХ

Автор Дмитрий Корнилов, Вчера в 16:37

0 Пользователей и 1 гость просматривают эту тему.

Дмитрий Корнилов

Здравствуйте, помогите пожалуйста исправить или помочь решением задач

Задание 4
&НаКлиенте
Процедура ЗаполнитьТовары(Команда)
    // Реализуем вызов заполнения по кнопке "Заполнить товары"
    ВыполнитьЗаполнениеЦенИзРегистра();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьСкладИПомещениеКонтрагентаНаСервере()
    Сообщить("Команда в разработке!!!");
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьСкладИПомещениеКонтрагента(Команда)
    ЗаполнитьСкладИПомещениеКонтрагентаНаСервере();
КонецПроцедуры

&НаСервере
Функция ВыбранныйКонтрагентДолжник()
    Возврат Объект.Контрагент.Должник;
КонецФункции

&НаКлиенте
Процедура УстановитьВидимость()
    Элементы.ДекорацияДолжник.Видимость = ВыбранныйКонтрагентДолжник();
КонецПроцедуры

&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
    УстановитьВидимость();
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    УстановитьВидимость();
КонецПроцедуры

&НаКлиенте
Процедура УстановитьФиксированнуюЦенуНаВсё(Команда)
    ОписаниеОповещения = Новый ОписаниеОповещения("УстановитьФиксированнуюЦенуНаВсёЗавершение", ЭтотОбъект);
    ПоказатьВводЧисла(ОписаниеОповещения, 0, "Введите фиксированную цену");
КонецПроцедуры

&НаКлиенте
Процедура УстановитьФиксированнуюЦенуНаВсёЗавершение(Число, ДополнительныеПараметры) Экспорт
    Если Число = 0 Тогда
        Возврат;
    КонецЕсли;
   
    Для Каждого стрТовары Из Объект.Товары Цикл
        стрТовары.Цена = Число;
        стрТовары.Сумма = стрТовары.Цена * стрТовары.Количество;
    КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ПересчётТекущихДанных()
    Элементы.Товары.ТекущиеДанные.Сумма = Элементы.Товары.ТекущиеДанные.Количество * Элементы.Товары.ТекущиеДанные.Цена;
КонецПроцедуры

&НаКлиенте
Процедура ТоварыКоличествоПриИзменении(Элемент)
    ПересчётТекущихДанных();
КонецПроцедуры

&НаКлиенте
Процедура ТоварыЦенаПриИзменении(Элемент)
    ПересчётТекущихДанных();
КонецПроцедуры

&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
    СтрокаТЧ = Элементы.Товары.ТекущиеДанные;
    Если СтрокаТЧ = Неопределено Или Не ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда
        Возврат;
    КонецЕсли;
   
    Если Не ЗначениеЗаполнено(Объект.Контрагент) Тогда
        Возврат;
    КонецЕсли;
   
    АктуальнаяЦена = ПолучитьЦенуИзРегистра(СтрокаТЧ.Номенклатура, Объект.Контрагент, Объект.Дата);
    СтрокаТЧ.Цена = АктуальнаяЦена;
   
    If ЗначениеЗаполнено(СтрокаТЧ.Количество) И СтрокаТЧ.Количество > 0 Тогда
        СтрокаТЧ.Сумма = СтрокаТЧ.Количество * СтрокаТЧ.Цена;
    КонецЕсли;
КонецПроцедуры

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

// --- РЕАЛИЗАЦИЯ ТРЕБОВАНИЯ ИЗ НОВОГО СНИМКА (ПРОДАЖА -> РОЗНИЧНАЯ) ---

&НаКлиенте
Процедура ВыполнитьЗаполнениеЦенИзРегистра()
    // Проверяем заполнение реквизитов перед вызовом сервера
    Если ЗначениеЗаполнено(Объект.Контрагент) Тогда
        Если Объект.Товары.Количество() > 0 Тогда
            ЗаполнитьЦеныИзРегистраНаСервере();
        КонецЕсли;
    Иначе
        ПоказатьПредупреждение(, "Не выбран контрагент в шапке документа!");
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьЦеныИзРегистраНаСервере()
   
    // 1. Выгружаем ТЧ в таблицу значений и сворачиваем
    ТаблицаНоменклатуры = Объект.Товары.Выгрузить(, "Номенклатура");
    ТаблицаНоменклатуры.Свернуть("Номенклатура");
   
    МассивНоменклатуры = ТаблицаНоменклатуры.ВыгрузитьКолонку("Номенклатура");
   
    // 2. Создаем запрос к СрезПоследних с отбором по Розничной цене
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Цены.Номенклатура КАК Номенклатура,
        |    Цены.Цена КАК Цена
        |ИЗ
        |    РегистрСведений.ОсновнаяЦенаКонтрагента.СрезПоследних(
        |        &Период,
        |        Контрагент = &Контрагент
        |            И ТипЦен = ЗНАЧЕНИЕ(Перечисление.ТипыЦен.Розничная)
        |            И Номенклатура В (&МассивНоменклатуры)) КАК Цены";
   
    Запрос.УстановитьПараметр("Период", Объект.Дата);
    Запрос.УстановитьПараметр("Контрагент", Объект.Контрагент);
    Запрос.УстановитьПараметр("МассивНоменклатуры", МассивНоменклатуры);
   
    Выборка = Запрос.Выполнить().Выбрать();
   
    // 3. Обходим результаты и обновляем табличную часть документа ПродажаТоваров
    Пока Выборка.Следующий() Цикл
       
        СтруктураПоиска = Новый Структура("Номенклатура", Выборка.Номенклатура);
        НайденныеСтроки = Объект.Товары.НайтиСтроки(СтруктураПоиска);
       
        Для Каждого СтрТЧ Из НайденныеСтроки Цикл
            СтрТЧ.Цена  = Выборка.Цена;
            СтрТЧ.Сумма = СтрТЧ.Цена * СтрТЧ.Количество;
        КонецЦикла;
       
    КонецЦикла;
   
КонецПроцедуры


Задание 5
РасходноКассовыйОрдер
&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
   
    // 1. Автоматическое заполнение Кассы через ЗАПРОС (из прошлого задания)
    Если ЗначениеЗаполнено(Объект.Контрагент) Тогда
        НайденаяКасса = ПолучитьКассуЧерезЗапрос(Объект.Контрагент, Объект.Дата);
        Если ЗначениеЗаполнено(НайденаяКасса) Тогда
            Объект.Касса = НайденаяКасса;
        КонецЕсли;
    КонецЕсли;
   
    // 2. Проверка и заполнение комментария
    ПроверитьИЗаполнитьКомментарий();
   
КонецПроцедуры

&НаКлиенте
Процедура СуммаПриИзменении(Элемент)
    ПроверитьИЗаполнитьКомментарий();
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьИЗаполнитьКомментарий()

    Если ПустаяСтрока(Объект.Комментарий) И Объект.Сумма <> 0 И ЗначениеЗаполнено(Объект.Контрагент) Тогда
       
        НаименованиеКонтрагента = ПолучитьНаименованиеКонтрагента(Объект.Контрагент);
       
        // Для РКО — "получил"
        Объект.Комментарий = СтрШаблон("%1 получил %2 р.", НаименованиеКонтрагента, Объект.Сумма);
           
    КонецЕсли;

КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьНаименованиеКонтрагента(Знач СсылкаКонтрагент)
   
    ПолноеНаименование = СокрЛП(СсылкаКонтрагент.ПолноеНаименование);
    Если ПустаяСтрока(ПолноеНаименование) Тогда
        Возврат СокрЛП(СсылкаКонтрагент.Наименование);
    Иначе
        Возврат ПолноеНаименование;
    КонецЕсли;

КонецФункции

&НаСервереБезКонтекста
Функция ПолучитьКассуЧерезЗапрос(Знач ТекущийКонтрагент, Знач ДатаДокумента)
   
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ОсновнаяКассаКонтрагентаСрезПоследних.Касса КАК Касса
        |ИЗ
        |    РегистрСведений.ОсновнаяКассаКонтрагента.СрезПоследних(&Период, Контрагент = &Контрагент) КАК ОсновнаяКассаКонтрагентаСрезПоследних";
   
    Запрос.УстановитьПараметр("Период",     ДатаДокумента);
    Запрос.УстановитьПараметр("Контрагент", ТекущийКонтрагент);
   
    ВыполнениеЗапроса = Запрос.Выполнить();
    Если Не ВыполнениеЗапроса.Пустой() Тогда
        Выборка = ВыполнениеЗапроса.Выбрать();
        Выборка.Следующий();
        Возврат Выборка.Касса;
    КонецЕсли;
   
    Возврат ПредопределенноеЗначение("Справочник.Кассы.ПустаяСсылка");
КонецФункции

&НаКлиенте
Процедура КомментарийОчистка(Элемент, СтандартнаяОбработка)
    Если ЗначениеЗаполнено(Объект.Контрагент) И Объект.Сумма <> 0 Тогда
        СтандартнаяОбработка = Ложь;
        ПоказатьПредупреждение(, "Нельзя очистить поле ""Комментарий"", пока заполнены контрагент и сумма!");
    КонецЕсли;   
КонецПроцедуры



ПриходноКассовыйОрдер
&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
   
    // 1. Автоматическое заполнение Кассы методом МЕНЕДЖЕРА (из прошлого задания)
    Если ЗначениеЗаполнено(Объект.Контрагент) Тогда
        НайденаяКасса = ПолучитьКассуМетодомМенеджера(Объект.Контрагент, Объект.Дата);
        Если ЗначениеЗаполнено(НайденаяКасса) Тогда
            Объект.Касса = НайденаяКасса;
        КонецЕсли;
    КонецЕсли;
   
    // 2. Проверка и заполнение комментария
    ПроверитьИЗаполнитьКомментарий();
   
КонецПроцедуры

&НаКлиенте
Процедура СуммаПриИзменении(Элемент)
    ПроверитьИЗаполнитьКомментарий();
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьИЗаполнитьКомментарий()

    Если ПустаяСтрока(Объект.Комментарий) И Объект.Сумма <> 0 И ЗначениеЗаполнено(Объект.Контрагент) Тогда
       
        // Оптимизированный серверный вызов без контекста формы
        НаименованиеКонтрагента = ПолучитьНаименованиеКонтрагента(Объект.Контрагент);
       
        // Для ПКО — "внес"
        Объект.Комментарий = СтрШаблон("%1 внес %2 р.", НаименованиеКонтрагента, Объект.Сумма);
           
    КонецЕсли;

КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьНаименованиеКонтрагента(Знач СсылкаКонтрагент)
   
    ПолноеНаименование = СокрЛП(СсылкаКонтрагент.ПолноеНаименование);
    Если ПустаяСтрока(ПолноеНаименование) Тогда
        Возврат СокрЛП(СсылкаКонтрагент.Наименование);
    Иначе
        Возврат ПолноеНаименование;
    КонецЕсли;

КонецФункции

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

&НаКлиенте
Процедура КомментарийОчистка(Элемент, СтандартнаяОбработка)
    Если ЗначениеЗаполнено(Объект.Контрагент) И Объект.Сумма <> 0 Тогда
        СтандартнаяОбработка = Ложь;
        ПоказатьПредупреждение(, "Нельзя очистить поле ""Комментарий"", пока заполнены контрагент и сумма!");
    КонецЕсли;   
КонецПроцедуры


Задание 6
Поступление товаров
&НаКлиенте
Процедура ЗаполнитьТовары(Команда)
    // Вызываем процедуру заполнения цен из регистра по кнопке на форме
    ВыполнитьЗаполнениеЦенИзРегистра();
КонецПроцедуры

&НаКлиенте
Процедура УстановитьФиксированнуюЦенНаВсё(Команда)
    ОписаниеОповещения = Новый ОписаниеОповещения("УстановитьФиксированнуюЦенНаВсёЗавершение", ЭтотОбъект);
    ПоказатьВводЧисла(ОписаниеОповещения, 0, "Введите фиксированную цену");
КонецПроцедуры

&НаКлиенте
Процедура УстановитьФиксированнуюЦенНаВсёЗавершение(Число, ДополнительныеПараметры) Экспорт
    Если Число = 0 Тогда
        Возврат;
    КонецЕсли;
   
    Для Каждого стрТовары Из Объект.Товары Цикл
        стрТовары.Цена = Число;
        стрТовары.Сумма = стрТовары.Цена * стрТовары.Количество;
    КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ПересчётТекущихДанных()
    ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
    Если ТекущиеДанные <> Неопределено Тогда
        ТекущиеДанные.Сумма = ТекущиеДанные.Количество * ТекущиеДанные.Цена;
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ТоварыКоличествоПриИзменении(Элемент)
    ПересчётТекущихДанных();
КонецПроцедуры

&НаКлиенте
Процедура ТоварыЦенаПриИзменении(Элемент)
    ПересчётТекущихДанных();
КонецПроцедуры

&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
    // Из автоматического заполнения убираем, так как теперь работаем строго по команде кнопки
КонецПроцедуры

// --- РЕАЛИЗАЦИЯ ТРЕБОВАНИЯ ИЗ НОВОГО СНИМКА ---

&НаКлиенте
Процедура ВыполнитьЗаполнениеЦенИзРегистра()
    // Проверяем, заполнен ли контрагент и есть ли вообще товары в списке
    Если ЗначениеЗаполнено(Объект.Contragent) Тогда // Проверьте, в вашей конфигурации "Контрагент" или "Contragent"
        Если Объект.Товары.Количество() > 0 Тогда
            ЗаполнитьЦеныИзРегистраНаСервере();
        КонецЕсли;
    Иначе
        ПоказатьПредупреждение(, "Не выбран контрагент в шапке документа!");
    EndIf;
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьЦеныИзРегистраНаСервере()
   
    // 1. Выгружаем ТЧ в таблицу значений и сворачиваем по Номенклатуре
    ТаблицаНоменклатуры = Объект.Товары.Выгрузить(, "Номенклатура");
    ТаблицаНоменклатуры.Свернуть("Номенклатура");
   
    // Получаем массив уникальной номенклатуры для множественного выбора (В)
    МассивНоменклатуры = ТаблицаНоменклатуры.ВыгрузитьКолонку("Номенклатура");
   
    // 2. Создаем запрос к виртуальной таблице СрезПоследних
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Цены.Номенклатура КАК Номенклатура,
        |    Цены.Цена КАК Цена
        |ИЗ
        |    РегистрСведений.ОсновнаяЦенаКонтрагента.СрезПоследних(
        |        &Период,
        |        Контрагент = &Контрагент
        |            И ТипЦен = ЗНАЧЕНИЕ(Перечисление.ТипыЦен.Закупочная)
        |            И Номенклатура В (&МассивНоменклатуры)) КАК Цены";
   
    // Передаем параметры (Текущая дата документа, Контрагент и массив Номенклатуры)
    Запрос.УстановитьПараметр("Период", Объект.Дата);
    Запрос.УстановитьПараметр("Контрагент", Объект.Контрагент);
    Запрос.УстановитьПараметр("МассивНоменклатуры", МассивНоменклатуры);
   
    Выборка = Запрос.Выполнить().Выбрать();
   
    // 3. Обходим выборку, обновляем строки ТЧ и пересчитываем суммы
    Пока Выборка.Следующий() Цикл
       
        СтруктураПоиска = Новый Структура("Номенклатура", Выборка.Номенклатура);
        НайденныеСтроки = Объект.Товары.НайтиСтроки(СтруктураПоиска);
       
        Для Каждого СтрТЧ Из НайденныеСтроки Цикл
            СтрТЧ.Цена  = Выборка.Цена;
            СтрТЧ.Сумма = СтрТЧ.Цена * СтрТЧ.Количество;
        КонецЦикла;
       
    КонецЦикла;
   
КонецПроцедуры

Задание 7

Уже есть в сверзу

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск