Имя: Пароль:
1C
1C 7.7
v7: ПриАктивизацииСтроки() или что-то подобное
,
0 Artificial
 
15.03.16
15:05
Доброго времени суток. Задача такая: создать форму подбора справочника "Номенклатура", в которой внизу есть текстовое поле, в котором отображается остаток текуего элемента. В 8.х понятно, как делать, а как в 7.7? Спасибо.
1 ДенисЧ
 
15.03.16
15:07
взять типовую тис и посмотреть...
или заплатить 10 000 рублей
2 Ёпрст
 
15.03.16
15:07
Делать аналогично и по-возможности, лучше
3 Artificial
 
15.03.16
15:07
(1) Доступа к ТиС нет.
(2) По теме есть что сказать?
4 Ёпрст
 
15.03.16
15:08
более того, останки лучше отображать не в отдельном поле, я в самой форме списка, в отдельной колонке.
Так проще для понимания
5 Злопчинский
 
15.03.16
15:08
Открыть типовую ТИС и посмотреть как работает функция ИнформацияОНоменклатуре()
6 Злопчинский
 
15.03.16
15:09
(3) а к банкомату?
7 Ёпрст
 
15.03.16
15:09
(3) Открыть любую типовую и посмотреть там форму подбора.
Потом переделать её на более правильный вариант, либо кешированием значений, либо на прямой запрос.
8 Ёпрст
 
15.03.16
15:09
либо и то и другое одновременно
9 Масянька
 
15.03.16
15:09
(4) У меня табличка с остатками по каждому складу по каждой номенклатуре(хвастаюсь).
10 Artificial
 
15.03.16
15:11
(9) Мне хотя бы по одному.
11 Масянька
 
15.03.16
15:12
(10) Полоску под ником видишь? Вот когда догонишь - будет по всем :)
12 Artificial
 
15.03.16
15:12
(11) Никто и не отрицает, что я нуб. А в 7.7 - тем более.
13 Злопчинский
 
15.03.16
15:14
(9) на экран влазит?
14 Масянька
 
15.03.16
15:14
(12) На:
Процедура глПолучитьОстаткиНоменклатуры(ФирмаДляОстатковТМЦ, Номенклатура, Единица, ОстаткиТМЦ, ОстатокНаСкладе, ОстатокПоФирме, Склад,
                                        РезервыТМЦ = 0, УчитыватьРезерв = 0, Договор = 0, Заявка = 0) Экспорт
    Если (Номенклатура.ВидНоменклатуры <> Перечисление.ВидыНоменклатуры.Услуга)
       и (Номенклатура.ВидНоменклатуры <> Перечисление.ВидыНоменклатуры.Работа) Тогда
                                  
        // Получим остаток.
        Если ПустоеЗначение(Склад) = 0 Тогда
            Если ТипЗначенияСтр(ФирмаДляОстатковТМЦ) = "Справочник" Тогда  // нужны сводные остатки только по одной фирме
                ОстатокНаСкладе = ОстаткиТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,Номенклатура,Склад,,"Количество");
                ОстатокПоФирме  = ОстаткиТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,Номенклатура,,,"Количество");
            ИначеЕсли ТипЗначенияСтр(ФирмаДляОстатковТМЦ) = "СписокЗначений" Тогда
                ОстатокНаСкладе = 0;
                ОстатокПоФирме  = 0;
                СчетчикЦикла = 0;
                Для СчетчикЦикла = 1 По ФирмаДляОстатковТМЦ.РазмерСписка() Цикл
                    ТекФирма = ФирмаДляОстатковТМЦ.ПолучитьЗначение(СчетчикЦикла);
                    ОстатокНаСкладе = ОстатокНаСкладе + ОстаткиТМЦ.СводныйОстаток(ТекФирма,Номенклатура,Склад,,"Количество");
                    ОстатокПоФирме  = ОстатокПоФирме  + ОстаткиТМЦ.СводныйОстаток(ТекФирма,Номенклатура,,,"Количество");
                КонецЦикла;
            КонецЕсли;
        Иначе
            Если ТипЗначенияСтр(ФирмаДляОстатковТМЦ) = "Справочник" Тогда  // нужны сводные остатки только по одной фирме
                ОстатокНаСкладе = ОстаткиТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,Номенклатура,,,"Количество");
            ИначеЕсли ТипЗначенияСтр(ФирмаДляОстатковТМЦ) = "СписокЗначений" Тогда
                ОстатокНаСкладе = 0;
                СчетчикЦикла = 0;
                Для СчетчикЦикла = 1 По ФирмаДляОстатковТМЦ.РазмерСписка() Цикл
                    ТекФирма = ФирмаДляОстатковТМЦ.ПолучитьЗначение(СчетчикЦикла);
                    ОстатокНаСкладе = ОстатокНаСкладе + ОстаткиТМЦ.СводныйОстаток(ТекФирма,Номенклатура,,,"Количество");
                КонецЦикла;
            КонецЕсли;
            ОстатокПоФирме = ОстатокНаСкладе;
        КонецЕсли;
        
        РезервНаСкладе = 0;
        РезервПоФирме  = 0;
        Если (ПустоеЗначение(РезервыТМЦ) = 0)
           и (УчитыватьРезерв <> 0) Тогда
               
            // Получим резерв.
            Если ПустоеЗначение(Склад) = 0 Тогда
                Если ТипЗначенияСтр(ФирмаДляОстатковТМЦ) = "Справочник" Тогда  // нужны сводные остатки только по одной фирме
                    РезервНаСкладе = РезервыТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,Номенклатура,Склад,,,"Количество");
                    РезервПоФирме  = РезервыТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,Номенклатура,,,,"Количество");
                    Если ПустоеЗначение(Договор) = 0 Тогда // Надо умеьшить резерв на резерв по этому договору
                        РезервНаСкладе = РезервНаСкладе - РезервыТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,Номенклатура,Склад,Договор,,"Количество");
                        РезервПоФирме  = РезервПоФирме  - РезервыТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,Номенклатура,,Договор,,"Количество");
                    ИначеЕсли ПустоеЗначение(Заявка) = 0 Тогда // Надо умеьшить резерв на резерв по этой заявке
                        РезервНаСкладе = РезервНаСкладе - РезервыТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,Номенклатура,Склад,,Заявка,"Количество");
                        РезервПоФирме  = РезервПоФирме  - РезервыТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,Номенклатура,,,Заявка,"Количество");
                    КонецЕсли;
                ИначеЕсли ТипЗначенияСтр(ФирмаДляОстатковТМЦ) = "СписокЗначений" Тогда
                    СчетчикЦикла = 0;
                    Для СчетчикЦикла = 1 По ФирмаДляОстатковТМЦ.РазмерСписка() Цикл
                        ТекФирма = ФирмаДляОстатковТМЦ.ПолучитьЗначение(СчетчикЦикла);
                        РезервНаСкладе = РезервНаСкладе + РезервыТМЦ.СводныйОстаток(ТекФирма,Номенклатура,Склад,,,"Количество");
                        РезервПоФирме  = РезервПоФирме  + РезервыТМЦ.СводныйОстаток(ТекФирма,Номенклатура,,,,"Количество");
                        Если ПустоеЗначение(Договор) = 0 Тогда // Надо умеьшить резерв на резерв по этому договору
                            РезервНаСкладе = РезервНаСкладе - РезервыТМЦ.СводныйОстаток(ТекФирма,Номенклатура,Склад,Договор,,"Количество");
                            РезервПоФирме  = РезервПоФирме  - РезервыТМЦ.СводныйОстаток(ТекФирма,Номенклатура,,Договор,,"Количество");
                        ИначеЕсли ПустоеЗначение(Заявка) = 0 Тогда // Надо умеьшить резерв на резерв по этой заявке
                            РезервНаСкладе = РезервНаСкладе - РезервыТМЦ.СводныйОстаток(ТекФирма,Номенклатура,Склад,,Заявка,"Количество");
                            РезервПоФирме  = РезервПоФирме  - РезервыТМЦ.СводныйОстаток(ТекФирма,Номенклатура,,,Заявка,"Количество");
                        КонецЕсли;
                    КонецЦикла;
                КонецЕсли;
            Иначе
                Если ТипЗначенияСтр(ФирмаДляОстатковТМЦ) = "Справочник" Тогда  // нужны сводные остатки только по одной фирме
                    РезервПоФирме = РезервыТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,Номенклатура,,,,"Количество");
                    Если ПустоеЗначение(Договор) = 0 Тогда // Надо умеьшить резерв на резерв по этому договору
                        РезервПоФирме  = РезервПоФирме  - РезервыТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,Номенклатура,,Договор,,"Количество");
                    ИначеЕсли ПустоеЗначение(Заявка) = 0 Тогда // Надо умеьшить резерв на резерв по этой заявке
                        РезервПоФирме  = РезервПоФирме  - РезервыТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,Номенклатура,,,Заявка,"Количество");
                    КонецЕсли;
                ИначеЕсли ТипЗначенияСтр(ФирмаДляОстатковТМЦ) = "СписокЗначений" Тогда
                    СчетчикЦикла = 0;
                    Для СчетчикЦикла = 1 По ФирмаДляОстатковТМЦ.РазмерСписка() Цикл
                        ТекФирма = ФирмаДляОстатковТМЦ.ПолучитьЗначение(СчетчикЦикла);
                        РезервПоФирме = РезервПоФирме + РезервыТМЦ.СводныйОстаток(ТекФирма,Номенклатура,,,,"Количество");
                        Если ПустоеЗначение(Договор) = 0 Тогда // Надо умеьшить резерв на резерв по этому договору
                            РезервПоФирме  = РезервПоФирме  - РезервыТМЦ.СводныйОстаток(ТекФирма,Номенклатура,,Договор,,"Количество");
                        ИначеЕсли ПустоеЗначение(Заявка) = 0 Тогда // Надо умеьшить резерв на резерв по этой заявке
                            РезервПоФирме  = РезервПоФирме  - РезервыТМЦ.СводныйОстаток(ТекФирма,Номенклатура,,,Заявка,"Количество");
                        КонецЕсли;
                    КонецЦикла;
                КонецЕсли;
                РезервНаСкладе = РезервПоФирме;
            КонецЕсли;
        КонецЕсли;
        
        ОстатокНаСкладе = ОстатокНаСкладе - РезервНаСкладе;
        ОстатокПоФирме  = ОстатокПоФирме  - РезервПоФирме;
        
        Если Единица.Коэффициент > 0 Тогда
            ОстатокНаСкладе = ОстатокНаСкладе / Единица.Коэффициент;
            ОстатокПоФирме  = ОстатокПоФирме  / Единица.Коэффициент;
        КонецЕсли;
        
    КонецЕсли;          
    
КонецПроцедуры // глПолучитьОстаткиНоменклатуры()
15 Масянька
 
15.03.16
15:15
(13) Шикарно.
16 Artificial
 
15.03.16
15:16
(14) Хм. То есть, нужно ПриОткрытии() или ПриОбновленииОтображения() вызывать заполнение для каждой номенклатуры текущего списка? Ох...
17 Масянька
 
15.03.16
15:19
(16) Нет. В таб. часть добавляешь колонку и на нее вешаешь эту процедуру.
18 Artificial
 
15.03.16
15:20
(17) Добавил. А процедуру некуда вешать. Вот на таблицу значений вешалась.
19 Масянька
 
15.03.16
15:22
(18) Во дурак :))))
Колонку выдели в конфигураторе, правую кнопку мыши - Дополнительно - Формула.
20 ДенисЧ
 
15.03.16
15:23
Дожили... Масянька людей уму учит.... ((
21 Масянька
 
15.03.16
15:24
(20) Что? Завидно?
Бухать меньше надо. И думать больше.
22 Artificial
 
15.03.16
15:25
(19) Можно было и не грубить.
И в этой процедурке получать БухИтоги и т. д.?
23 Масянька
 
15.03.16
15:27
(22) Я ж (практически) любя :)
И ни разу не грубила...
24 Злопчинский
 
15.03.16
15:29
(14) типовой код с типовыми граблями из ТИСа
25 Artificial
 
15.03.16
15:29
(23) Проехали, ладно. Вот такой огрызок. Я в правильном направлении двигаюсь?

Процедура ПриИзмененииОстаток()
    
    БухИтоги = СоздатьОбъект("БухгалтерскиеИтоги");
    Сч41_3 = СчетПоКоду("41.3");
    
    Остаток = БухИтоги.СКД(Сч41_3, "К",, ТекущийЭлемент());
    
КонецПроцедуры
26 Mikeware
 
15.03.16
15:31
(25) бухитоги - создание робъекта - вынеси за процедуру куданить
27 Artificial
 
15.03.16
15:33
(26) Не совсем понятно, как и зачем.
28 Mikeware
 
15.03.16
15:36
(27) как - создать переменную модуля, а объект создать в Приоткрыиии или в тексте модуля
зачем - чтоб не тратить время каждый раз на создание объекта
29 Artificial
 
15.03.16
15:39
(28) Послушал совета, теперь так.

Перем БухИтоги;
Перем  Сч41_3;

Процедура ПриОткрытии()

    БухИтоги = СоздатьОбъект("БухгалтерскиеИтоги");
    Сч41_3 = СчетПоКоду("41.3");

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

Процедура ПриИзмененииОстаток()
    
    
    Остаток = БухИтоги.СКД(Сч41_3, "К",, ТекущийЭлемент());
    
КонецПроцедуры
30 Ёпрст
 
15.03.16
15:41
проще, в приОткрытии получить все останки, кинуть их в ИТЗ или ТЗ, на форму кинуть текстовую колонку с функцией, в функции поиск в ИТЗ или ТЗ и показ остатка.
31 HawkEye
 
15.03.16
15:41
подписываюсь )))
32 Artificial
 
15.03.16
15:44
(30) Начнем с 1-го пункта. Как получить все элементы в списке?
33 Ёпрст
 
15.03.16
15:55
(32) зачем ?
34 Ёпрст
 
15.03.16
15:56
просто получаешь воооообще все останки.
При желании, можно штатно получать элементы именно из формысписка, только занафига ?
35 Artificial
 
15.03.16
16:11
(34) Не слишком ли долго будет?
36 Ёпрст
 
15.03.16
16:18
(35) будет быстрее, чем получение остатка каждый раз для каждой строки как в (29)
37 Ёпрст
 
15.03.16
16:19
ты же получишь один раз остатки , и потом просто будешь их искать в кеше - тз/итз.
38 Artificial
 
15.03.16
16:28
(37) Ладно, вечером попробую. Спасибо.
39 Mikeware
 
15.03.16
16:30
(37) дык кэширование - это хорошо. но как с конкурентной работой быть тогда?
40 Злопчинский
 
15.03.16
16:45
(39) остатки "для посмотреть" - имхо не сильно чувствительны к конкурентной работе. Иначе как только открыл на просмотр список - всё, надо блокировать, чтобы никто не забрал то что ты смотришь...

а если при просмотре - условно - объявил клиенту количество (или принял другое РЕШЕНИЕ по количеству) - либо БЛОКИРУЙ это количество (например горячее резервирование), либо ну и фиг с ним. побозарил 10 мин, выбранные колва запусил на проведение - ну ругнулось на 5 строк из 10 что не хваетет - а и правильно ибо нефиг по телефону время отнимать..
41 Ёпрст
 
15.03.16
17:57
(39) забить :)
Как правило, редко где это надо
42 Карупян
 
15.03.16
18:09
(41) А если 100 тыщ позиций номенклатуры.
Не будет ли открытие формы секунд 30?
43 Карупян
 
15.03.16
18:09
Опять же в 77 тз не индексированная поиск по ней те такой и быстрый
44 Mikeware
 
16.03.16
08:13
(43) ну, у некоторых людей в 7.7 есть и индексированные таблицы :-)
45 Ёпрст
 
16.03.16
08:43
(42) это вообще ни о чем
46 Artificial
 
16.03.16
10:17
Создал колонку "Остаток", в модуле следующий текст:

Перем БухИтоги;
Перем  Сч41_1;

Процедура ПриОткрытии()

    БухИтоги = СоздатьОбъект("БухгалтерскиеИтоги");
    БухИтоги.ПериодМ(ТекущаяДата());
    Сч41_1 = СчетПоКоду("41.1");
    
КонецПроцедуры

Функция  ПриИзмененииОстаток()
    
    Остаток = БухИтоги.СКД(Сч41_1, "К",, ТекущийЭлемент());
    
КонецФункции

Вопрос: почему не выводит?
47 Масянька
 
16.03.16
10:19
(46) На колонку "Остаток" повесил функцию ПриИзмененииОстаток?
48 HawkEye
 
16.03.16
10:21
(46) ну как бы, по идеологии программирования, функция должна что-то возвращать, не?
49 Artificial
 
16.03.16
10:22
(47) Да.
(48) Действительно.
50 Mikeware
 
16.03.16
10:23
(48) у него void :-)
51 HawkEye
 
16.03.16
10:23
(49) и хде этот возврат?
52 Artificial
 
16.03.16
10:24
(51) Хм, когда писал Возврат Остаток = БухИтоги.СКД(Сч41_1, "К",, ТекущийЭлемент());, не работало. Оказывается, надо писать
Остаток = БухИтоги.СКД(Сч41_1, "К",, ТекущийЭлемент());
Возврат Остаток;
53 HawkEye
 
16.03.16
10:25
(52) я тебе больше скажу...
можно писать
Возврат БухИтоги.СКД(Сч41_1, "К",, ТекущийЭлемент());
54 HawkEye
 
16.03.16
10:27
(50) тебе хорошо, ты умный... а автор теперь зависнет )))
55 Artificial
 
16.03.16
10:29
(54) Это не С++, войды не катят.
56 Масянька
 
16.03.16
10:39
(55) Ты не поверишь - http://www.1cpp.ru/index.php/Main
57 Artificial
 
16.03.16
11:22
Следующий вопрос: передаю параметр в форму. Почему он не подхватывается?
Передаю:
ОткрытьПодбор("Справочник.Номенклатура", "ДляОбработки", Склад);
Получаю:
Процедура ПриОткрытии()
ПолучПараметр = Форма.Параметр;
КонецПроцедуры
58 Artificial
 
16.03.16
11:23
(56) Даром не нужен.
59 Масянька
 
16.03.16
11:29
(58) Зря.
(57) Для подбора есть стандартные обработки и свою форма справочника (по крайней мере, в ТиС). Может стоит посмотреть в своей конфигурации?
60 Artificial
 
16.03.16
11:30
(59) Я перетянул стандартную и переделал.
61 Ёпрст
 
16.03.16
11:30
(57)
Процедура ПриОткрытии()
  Сообщить(Форма.Параметр);//должна сообщить твой Склад, если че
62 Остап Сулейманович
 
16.03.16
11:33
(59) Че там в типовых смотреть. В (57) все правильно написано.
Вопрос может быть только "где это написано".
1. Вот это вот
Процедура ПриОткрытии()
   ПолучПараметр = Форма.Параметр;
КонецПроцедуры
должно быть прописанов в форме "Справочник.Номенклатура.ДляОбработки"
2. Нужно убедиться, что когда вызывается вот это :
ОткрытьПодбор("Справочник.Номенклатура", "ДляОбработки", Склад);
Склад уже определен.
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.