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

Вопрос по построению языка

Автор Pinok Pod Zad, 15 мар 2013, 11:27

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

Pinok Pod Zad

Оговорюсь, Программист я новый , скажем так учусь...скажем так самоучка...и знания в некоторых местах хромают...поэтому надеюсь на ваше понимание...


Суть вопроса. Стоит предо мной задача следующего характера -


Есть документ, у него есть макет документа , в документе есть куча всяких строк,но меня (нас) интересуют только две - называются они "ПлановаяРабота" имеет тип СправочникСсылка   и  "ПлановаяРаботаН" тип строка
в данный момент они имеют практически одну смысловую нагрузку , лишь с той разницой что в первой строке можно брать информацию из справочника , а во второй писать что хочется ... так вот сейчас программа написана так что  - если первая строка не заполнена тогда выводится (в макет и соответственно потом на печать) вторая строка , но если же первая строка заполнена то выводится только первая...


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


вот что я навоял но не работает , подскажите что  править


Если (СтрРаб.ПлановаяРабота = Неопределено)
и (СтрРаб.ПлановаяРаботаН = Неопределено)
Тогда
ОбластьСтрока.Параметры.РемОперация = ""+СтрРаб.ПлановаяРабота+" "+ СтрРаб.ПлановаяРаботаН+"";
КонецЕсли;

      
      //
      Если СтрРаб.ПлановаяРабота.Пустая() = Истина Тогда                       
         ОбластьСтрока.Параметры.РемОперация = СтрРаб.ПлановаяРаботаН;
      Иначе   
         ОбластьСтрока.Параметры.РемОперация = СтрРаб.ПлановаяРабота;
      КонецЕсли;   



до этого эксперементировал разными вариациями по типу
Если СтрРаб.ПлановаяРабота.Пустая() = Ложь
         и СтрРаб.ПлановаяРаботаН.Пустая() = Ложь
      Тогда



но все не то...
надеюсь на позновательный разговор.за ранее спасибо

Санчес

А почему не просто так:

    ОбластьСтрока.Параметры.РемОперация = "" + СтрРаб.ПлановаяРабота + ПлановаяРаботаН;

Pinok Pod Zad

когда я пишу

ОбластьСтрока.Параметры.РемОперация = СтрРаб.ПлановаяРабота + СтрРаб.ПлановаяРаботаН ;

не зависимо от того заполнена ли вторая строка или нет , выдает только первую ...

а написал так как привел в начале потому что мне сделал замечание знакомый 1Сник :" ОбластьСтрока.Параметры.РемОперация = ""+СтрРаб.ПлановаяРабота+" "+ СтрРаб.ПлановаяРаботаН+"";
Так напиши, иначе у тебя она пытается проссумировать значение строк
"
а до этого замечания у меня было написано так как вы посоветовали.


Добавлено: 15 мар 2013, 12:56


Вообщем то разобрался!

во превых

Если (СтрРаб.ПлановаяРабота = Неопределено)
и (СтрРаб.ПлановаяРаботаН = Неопределено)
Тогда
ОбластьСтрока.Параметры.РемОперация = ""+СтрРаб.ПлановаяРабота+" "+ СтрРаб.ПлановаяРаботаН+"";
КонецЕсли;

     
       //
      Если СтрРаб.ПлановаяРабота.Пустая() = Истина Тогда                       
         ОбластьСтрока.Параметры.РемОперация = СтрРаб.ПлановаяРаботаН;
      Иначе   
         ОбластьСтрока.Параметры.РемОперация = СтрРаб.ПлановаяРабота;
      КонецЕсли;


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

а во вторых не много сменил формулировку первого если и получилось что то подобное -

Если СтрРаб.ПлановаяРабота.Пустая() = Истина Тогда                       
ОбластьСтрока.Параметры.РемОперация = СтрРаб.ПлановаяРаботаН;
КонецЕсли;
   Если СтрРаб.ПлановаяРабота.Пустая() = Ложь Тогда
ОбластьСтрока.Параметры.РемОперация = СтрРаб.ПлановаяРабота;
КонецЕсли;


Если НЕ ЗначениеЗаполнено(СтрРаб.ПлановаяРабота)= Ложь
И

НЕ ЗначениеЗаполнено(СтрРаб.ПлановаяРаботаН)= Ложь

Тогда
ОбластьСтрока.Параметры.РемОперация = ""+СтрРаб.ПлановаяРабота+" "+ СтрРаб.ПлановаяРаботаН+"";
        КонецЕсли;


как правильнее?
 
Если (СтрРаб.ПлановаяРабота = Неопределено)
и (СтрРаб.ПлановаяРаботаН = Неопределено)


или

Если НЕ ЗначениеЗаполнено(СтрРаб.ПлановаяРабота)= Ложь
И

НЕ ЗначениеЗаполнено(СтрРаб.ПлановаяРаботаН)= Ложь


???



Добавлено: 15 мар 2013, 13:10


Написал первую часть кода более лаконично


Если СтрРаб.ПлановаяРабота.Пустая() = Истина Тогда                       
ОбластьСтрока.Параметры.РемОперация = СтрРаб.ПлановаяРаботаН;
Иначе
ОбластьСтрока.Параметры.РемОперация = СтрРаб.ПлановаяРабота;
КонецЕсли;

Если НЕ ЗначениеЗаполнено(СтрРаб.ПлановаяРабота)= Ложь
И

НЕ ЗначениеЗаполнено(СтрРаб.ПлановаяРаботаН)= Ложь

Тогда
ОбластьСтрока.Параметры.РемОперация = ""+СтрРаб.ПлановаяРабота+" "+ СтрРаб.ПлановаяРаботаН+"";
КонецЕсли;

Msoul

Попробуете так:

Текст = "";
Если ЗначениеЗаполнено(СтрРаб.ПлановаяРабота) Тогда
    Текст = Текст + СтрРаб.ПлановаяРабота;
КонецЕсли
ОбластьСтрока.Параметры.РемОперация = Текст + " " + СтрРаб.ПлановаяРаботаН;

SlazZy

Цитата: Pinok Pod Zad от 15 мар 2013, 12:15как правильнее?
У вас беда с пониманием типов данных :)
Если тип данных ПлановаяРабота ТОЛЬКО один справочник, то надо сравнивать его с пустой ссылкой этого типа справочника. Справочники["ПлановаяРабота"].ПустаяСсылка()
Если тип данных составной, то пустое значение - Неопределено, поэтому и сравнивать надо с Неопределено.
Если Тип данных "строка", то можно использовать сравнение с пустой строкой "", использовать функцию "ПустаяСтрока()".

Ну, в вашем случае всё таки лучше применить ЗначениеЗаполнено() :) эта функция проверяет на заполненность почти любой тип данных

Ну и на мой взгляд красивее применять более интеллектуальные проверки :) Что-то вроде:
ОбластьСтрока.Параметры.РемОперация = ?(ЗначениеЗаполнено(СтрРаб.ПлановаяРабота),СтрРаб.ПлановаяРабота+" ","") +?(ЗначениеЗаполнено(СтрРаб.ПлановаяРаботаН),СтрРаб.ПлановаяРаботаН,"");
Вместо всей вашей проверки :)

Pinok Pod Zad

не не не , мне текст и прочее совсем не нужно , эти данные идут в макет печатной формы и никакой текст кроме того который вписан (если вписан) в СтрРаб.ПлановаяРабота и в СтрРаб.ПлановаяРаботаН  мне не нужно передовать в печатную форму... с кодом что привел выше все работает ...только мне не нравиться часть кода которая

Если НЕ ЗначениеЗаполнено(СтрРаб.ПлановаяРабота)= Ложь
             И
           
             НЕ ЗначениеЗаполнено(СтрРаб.ПлановаяРаботаН)= Ложь


хочу лаконичнее её соченить на подобии

Если СтрРаб.ПлановаяРабота.Пустая = Ложь
и
СтрРаб.ПлановаяРаботаН.Пустая = Ложь


вот только конфликт типов выходит (вернее не конфликт типов а прога ругается - "Значение не является значением объектного типа (Пустая)
      Если СтрРаб.ПлановаяРабота.Пустая()= Ложь
")

ДЛя справки -

ПлановаяРабота = тип - СправочникСсылка
ПлановаяРабота = тип - Строка

мне сказали что к первому не подойдет оператор Пустая() , а нужен Неопределено ... но мне нужен противовес оператору Неопределено для коректной работы (что то на подобии Определено - но конкретно такого нету) , что использовать в таком случае? конкретно в моем коде смущает формулировка

Если Не ...(...) = Ложь
и
Не ...(...) = Ложь


если это правильно с точки зрения стандартизации 1С то я успокоюсь, ежели нет...то нужно как то красивее сформулировать...
Добавлено: 15 мар 2013, 13:42


З.Ы.это я Msoul отвечал...щас анализирую следующий пост , но с первых строк вы SlazZy повторили слова моего знакомого 1Сника который попутно изредка инструктирует в аське...

SlazZy

Цитата: Pinok Pod Zad от 15 мар 2013, 13:39З.Ы.это я Msoul отвечал...щас анализирую следующий пост , но с первых строк вы SlazZy повторили слова моего знакомого 1Сника который попутно изредка инструктирует в аське...

На мой взгля инструктирует он вас плохо, ибо в восьмерке нету функции Пустая(), если вы конечно её сами не создадите. А есть функция ПустаяСсылка().
Сравнивать с Неопределено - НЕ ВЕРНО, точнее верно в очень конкретных случаях. Неопределено это Тип данных и появляется он далеко не всегда. В частности только в случае пустого значения для составного типа данных или его возвращают некоторые встроенные функции.


Если Не ...(...) = Ложь
и
Не ...(...) = Ложь

Тоже не совсем каноническая запись, оно конечно будет работать, но для стандартизации рекомендуется писать это как
Если НЕ Значение И НЕ Значение Тогда

ЦитироватьПлановаяРабота = тип - СправочникСсылка
ПлановаяРабота = тип - Строка

мне сказали что к первому не подойдет оператор Пустая() , а нужен Неопределено
Вас жестоко обманули, тут всё как раз наоборот. Надо сравнивать со значением пустой ссылки и нельзя сравнивать с неопределено.
Добавлено: 15 мар 2013, 14:11


в общем, вот это
Если СтрРаб.ПлановаяРабота.Пустая() = Истина Тогда                       
            ОбластьСтрока.Параметры.РемОперация = СтрРаб.ПлановаяРаботаН;
        Иначе   
            ОбластьСтрока.Параметры.РемОперация = СтрРаб.ПлановаяРабота;
        КонецЕсли;
       
        Если НЕ ЗначениеЗаполнено(СтрРаб.ПлановаяРабота)= Ложь
             И
           
             НЕ ЗначениеЗаполнено(СтрРаб.ПлановаяРаботаН)= Ложь
           
             Тогда
             ОбластьСтрока.Параметры.РемОперация = ""+СтрРаб.ПлановаяРабота+" "+ СтрРаб.ПлановаяРаботаН+"";
        КонецЕсли;


Надо писать как-то так
ОбластьСтрока.Параметры.РемОперация = ?(ЗначениеЗаполнено(СтрРаб.ПлановаяРабота),СтрРаб.ПлановаяРабота+" ","") +?(ЗначениеЗаполнено(СтрРаб.ПлановаяРаботаН),СтрРаб.ПлановаяРаботаН,"");
или так
Если НЕ СтрРаб.ПлановаяРабота.ПустаяСсылка() Тогда
Текст = Строка(СтрРаб.ПлановаяРабота)+" ";
Иначе
Текст = "";
КонецЕсли;

ОбластьСтрока.Параметры.РемОперация = Текст + СтрРаб.ПлановаяРаботаН;

Pinok Pod Zad

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

про Пустая() - эта процедура уже была  и фигурировала в первоначальном коде и я начал с ней "играться" , а вот ПустаяСсылка() - ругается на нее и после того как точку ставлю после

СтрРаб.ПлановаяРабота.

предлагает мне только Пустая()   и нету никакой ПустаяСсылка() в всплывающем окне (хотя может это и не важно)

уточню , работаю с 1С 8.1

SlazZy

оу, фак )) пора в отпуск идти :lol: конечно же надо так
Если НЕ СтрРаб.ПлановаяРабота.Пустая() Тогда
    Текст = Строка(СтрРаб.ПлановаяРабота)+" ";
Иначе
    Текст = "";
КонецЕсли;

ОбластьСтрока.Параметры.РемОперация = Текст + СтрРаб.ПлановаяРаботаН;
   
Добавлено: 15 мар 2013, 14:15


Цитироватьпро Пустая() - эта процедура уже была  и фигурировала в первоначальном коде и я начал с ней "играться" , а вот ПустаяСсылка() - ругается на нее и после того как точку ставлю после

Извиняюсь )) это я упоролся окончательно.

Если у вас тип данных ссылка, то проверка на пустоту выглядит так Значение.Пустая() или так Значение = Справочники["ИмяСправочника"].ПустаяСсылка()

Но вы видимо несколько не так поняли её принцип. Если значение пустое, то она возвращает Истину, если заполнено - ложь.

Pinok Pod Zad

SlazZy, Огромное вам спасибо! скопировал ваш код все работает! плюсую Вам!

Msoul, Извиняюсь, Вы тоже были где то рядом!это просто я чет тупанул и испугался оператра Текст ... выскочила асоциация с оператором Сообщить  )))

вообщем всем плюсы.Всем спасибо!!!

Теги:

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

Рейтинг@Mail.ru

Поиск